ã·ãªãŒãºã®ãã¹ãŠã®æçš¿ïŒ
ããŒã1.玹ä»ãšã»ããã¢ããããŒã2.ã³ãŒãã®åŠç¿ããŒã3. VSTããã³AUããŒã4.ããžã¿ã«æªã¿ããŒã5.ããªã»ãããšGUIããŒã6.ä¿¡å·åæããŒã7. MIDIã¡ãã»ãŒãžã®åä¿¡ããŒã8.ä»®æ³ããŒããŒãããŒã9.å°çããŒã10. GUIã®æ¹åããŒã11.ãã£ã«ã¿ãŒããŒã12.äœåšæ³¢çºæ¯åšããŒã13.åèšèšããŒã14.ããªãã©ããŒ1ããŒã15.ããªãã©ããŒ2ããŒã16.ã¢ã³ããšã€ãªã¢ã¹
å€å
žçãªæžç®æ¹åŒã·ã³ã»ãµã€ã¶ãŒã®ãã¹ãŠã®ã³ã³ããŒãã³ãã¯ãã§ã«äœæãããŠããŸãã次ã«ãæ§é ãæ確ã«ç解ããã®ã§ãåèšèšãè¡ããŸãã
ãã©ã°ã€ã³ã¯ã
SpaceBass ïŒKasmichi BassïŒãšåŒã°ããããªãã©ããã¯ã·ã³ã»ãµã€ã¶ãŒã«ãªããŸãã
ãã©ã°ã€ã³ã«ã¯2ã€ã®ãªã·ã¬ãŒã¿ãŒãããããã®ãµãŠã³ãã¯ãã³ãã«ã䜿çšããŠããã¯ã¹ã§ããŸãã å·Šã«åã-æåã®ãªã·ã¬ãŒã¿ãŒã®ã¿ã鳎ããå³ã«åããš2çªç®ã®ãªã·ã¬ãŒã¿ãŒã鳎ããŸãã çãäžã®äœçœ®ã¯ãäž¡æ¹ã®ãªã·ã¬ãŒã¿ãŒã®ãµãŠã³ããåãæ¯çã§æäŸããŸãã pitch modããã¯ã察å¿ãããªã·ã¬ãŒã¿ãŒã®ããŒã³ã®å€èª¿ã¬ãã«ãäœåšæ³¢ãªã·ã¬ãŒã¿ãŒã§èª¿æŽããŸãã ããªã¥ãŒã ãšãã£ã«ã¿ãŒãšã³ãããŒãã¯æ¢ã«ããã£ãŠããŸãã ãLFO amountãããããã£ã«ã¿ãŒã»ã¯ã·ã§ã³ã«è¡šç€ºãããŸããã LFOãã«ãããªãåšæ³¢æ°ã«ã©ã®ããã«åœ±é¿ããããå¶åŸ¡ããŸãã
ãã®æ®µéã§ããèŠãç®ã¯è¯ãã§ãã é²è¡ç¶æ³ãè©äŸ¡ããŸãããã ãã§ã«è¡ã£ãããšã¯æ¬¡ã®ãšããã§ãã
- MIDIã¬ã·ãŒããŒ
- ä»®æ³ããŒããŒã
- çºæ¯åš
- ããªã¥ãŒã ãšã³ãããŒã
- ãã«ãã¢ãŒããã£ã«ã¿ãŒ
- ãã£ã«ã¿ãŒãšã³ãããŒã
- LFO
ãããŠãããããè¡ãããããšã®ãªã¹ãã§ãã
- æ°ãããã¶ã€ã³
- ããªãã©ããŒ
- ãªã·ã¬ãŒã¿ãŒãµãŠã³ãã®ããã·ã³ã°ïŒç°¡åã§ãïŒ
- ãªã·ã¬ãŒã¿ãŒããŒã³å€èª¿
ããªããèŠãããšãã§ããããã«ãã»ãšãã©ã¯ãã§ã«è¡ãããŠããŸãïŒ
èšç»ã¯æ¬¡ã®ãšããã§ãããŸããPhotoshopã§ã°ã©ãã£ãã¯ãã¶ã€ã³ãã©ã®ããã«äœæãããããèŠãŠãã ããã 次ã«ãäž»ãªéšåã¯ããªãã©ããŒã§ããããã©ã°ã€ã³ã®æ§é ããããã«å€æŽããŸãã æåŸã«ãããŒã³å€èª¿ãè¿œå ããŸãã
ãããã®ã¿ã¹ã¯ã3ã€ã®æçš¿ã«åå²ããŸãã ããã¯ãã¶ã€ã³ã«é¢ãããã®ã§ãããä»ã®2ã€ã¯ããªãã©ããŒã«é¢ãããã®ã§ããããã¯ããªãé¢åãªéšåã ããã§ãã
æ°ãããã¶ã€ã³
ãã³ãã«ã¯ããããã«å€æŽããã
ãã¹ã®ãããªã¬ã¹ãªãŒãµã³ãã©ãŒãã®ããã§ã ã ç§ã¯ãããå°ããããããããåºãã圱ããããã«å€ããŸããã å€æŽãããããŒãžã§ã³ã¯
ãããããããŠã³ããŒãã§ã
ãŸã ã
ãã®ã¬ã€ãã䜿ã£ãŠæ°ããããŒããŒããäœããŸããã
Photoshopãå
¥æããå ŽæãšãPhotoshopã§ãã¹ãŠãæç»ããæ¹æ³ã«ã€ããŠã¯è©³ãã説æããŸããããã¬ã€ã€ãŒã®æ§é ãšäœæ¥ã®äžè¬çãªååã«ã€ããŠèª¬æããŸãã
ã¢ãŒã«ã€ããããTIFãããŠã³ããŒãããŠè§£åããPhotoshopãŸãã¯GIMPã§éããŸãã æ§é ãæãäžããŠãã©ã®ããã«äœæãããããç解ã§ããããã«ãæ§é ããã®ãŸãŸã«ããŠããããšããŸããã ããã¹ããå€æŽããå Žåã¯ãããŽçšã®
Tusjãšçœ²åçšã®
Avenir 85 Heavyã® 2ã€ã®ãã©ã³ããå¿
èŠã«ãªããŸãã æ®å¿µãªããã2çªç®ã®ãã®ã¯ç¡æã§ã¯ãªããªããŸããããããšãã°ã代ããã«Helveticaã䜿çšã§ããŸãã ã·ã¹ãã ã«ãã©ã³ããããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸãã
ã¹ããŒããªããžã§ã¯ããšãã¯ã¿ãŒã·ã§ã€ã
Photoshopã§ã¬ã€ã€ãŒã®æ§é ã調ã¹ããšãã»ãšãã©ã®ãªããžã§ã¯ãããã¯ã¿ãŒã·ã§ã€ããš
ã¹ããŒããªããžã§ã¯ãã§ããããšãããã
ãŸã ã 次ã®å Žåã«ã¹ããŒããªããžã§ã¯ãã䜿çšããããšã匷ããå§ãããŸãã
- è€æ°ã®å Žæã§åãã³ã³ããŒãã³ããå¿
èŠãªå Žå
- ãªããžã§ã¯ãã®ã°ã«ãŒãã«ãšãã§ã¯ããé©çšããå ŽåïŒããã³CS6ãããæ°ããããŒãžã§ã³ã®Photoshopã䜿çšããå ŽåïŒ
- æ
å ±ã倱ãããšãªããªããžã§ã¯ããå転ãããããããã®ãªããžã§ã¯ããå転ãããŠæ»ããã
æåã®é
ç®ã¯ããããšæ³¢åœ¢ã¹ã€ããã«é¢é£ããŠããŸãã ãããã¯ããã€ãã®å Žæã«çŸãããããã®ã€ã³ã¹ã¿ã³ã¹ã¯åäžã«èŠããŸãã ïŒ
VãæŒããŠïŒ
移åããŒã«ãéžæããMacã§CmdãŸãã¯Windowsã§CtrlãæŒããªããã波圢ã¹ã€ãããã¯ãªãã¯ããŸãã ã¬ã€ã€ãŒãã¬ããã§ã
ã·ã§ã€ããšåŒã°ããã¬ã€ã€ãŒ
ã匷調衚瀺ãããŸãã ãã¬ãã¥ãŒãããã«ã¯ãªãã¯ããŠãã¹ããŒããªããžã§ã¯ããéããŸãã 波圢ããã¯ãã«ãªããžã§ã¯ãã§ããããšãæããã«ãªããŸãã
ãã¯ãã«ãªããžã§ã¯ãã®å©ç¹ã¯ã
æ倱ãªãå¯èœãªããããæ¹æ³ã§å転ãã¹ã±ãŒãªã³ã°ãããã³å€æŽã§ãã
ããšã§ãã ãã®ãããããšãã°ããã¯ã»ã«å¯åºŠã®é«ãç»é¢çšã®æ°ããããŒãžã§ã³ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå¿
èŠãªå Žåã¯ããããã®ç»åãã¹ã±ãŒãªã³ã°ããã ãã§æžã¿ãŸãã ã¯ããJKnobManãããã³ããšã¯ã¹ããŒãããå¿
èŠããããŸããããã¹ãŠã®ãã³ã¯åäžã®ã¹ããŒããªããžã§ã¯ãã§ããããã亀æã¯éåžžã«ç°¡åã§ãã
ããŒããŒãã¬ã€ã€ãŒã°ã«ãŒããåæããŠã¿ãŸãããã å
éšã«ã¯4ãªã¯ã¿ãŒãããããŸãã ãªã¯ã¿ãŒãã¯ã¹ããŒããªããžã§ã¯ãã§ãããã1ãªã¯ã¿ãŒãã§è¡ããããã¹ãŠã®å€æŽã¯ä»ã®ãªã¯ã¿ãŒãã«åœ±é¿ããŸãã ããšãã°ã
Octave 4ãéããŠãã¬ããã確èªããŸãã
ãã¹ãŠã®é»ã®ããŒã¯1ã€ã®ã¹ããŒããªããžã§ã¯ããæããçœãããŒãæããŸãã ã¬ã€ã€ãŒãã¬ããã®é»ãããŒãããã«ã¯ãªãã¯ããŸãã 3ã€ã®ãã¯ãã«åœ¢åŒã§æ§æãããããšãæããã«ãªããŸãã
ä»ãé»ãããŒã®è§ãå°ãæ»ããã«ããããšæ³åããŠãã ããã ã³ããŒããªãããããå Žåãä»ãããã¹ãŠãã¬ãŒãããå¿
èŠããããŸãã ãããããã®ã¢ãããŒãã§ã¯ããã¹ãŠ1ã€ã®ããŒãç·šéããããšã«ãªããŸãã
Photoshopã䜿çšããŠãããã€ãã®ååã«åŸããŸãã
- å¯èœãªéããéç Žå£çã«äœæ¥ããŸãã ã¹ããŒããã£ã«ã¿ãŒã䜿çšããã©ã¹ã¿ãŒãªããžã§ã¯ããã¹ã±ãŒãªã³ã°ãããã¬ã€ã€ãŒã®ã©ã¹ã¿ãŒåãåé¿ããŸãã äœããã©ã¹ã¿ã©ã€ãºãããšããªããžã§ã¯ãã®å
ã®æ§é ã«é¢ãããã¹ãŠã®æ
å ±ã倱ãããŸãã ããã§ãã©ã¹ã¿ã©ã€ãºããå¿
èŠãããå Žåã¯ãå¿
èŠã«å¿ããŠæåã«ãã¯ã¿ãŒãã©ãŒã ã®ããã¯ã¢ããã³ããŒãäœæããããã«æ»ããŸãã
- ã¹ããŒããªããžã§ã¯ãã䜿çšããã³ããŒã¯é¿ããŠãã ããã äœããã³ããŒããåã«ãèªåããŠãã ãããã³ããŒãå€æŽããŸããïŒ ããã§ãªãå Žåã¯ããã ã³ããŒã§ã¯ãªããã¹ããŒããªããžã§ã¯ããå¿
èŠã§ãã
- ããšãã°ã ãã³ããŒã«ã䜿çšããŠãè§äžžé·æ¹åœ¢ãªã©ã®ãªããžã§ã¯ããç·šéããŸãã ãã®ããŒã«ã䜿çšãããšãæ²ç·ãªã©ã®å Žæãä¿åã§ããŸãã
ç¬èªã®ä»®æ³ããŒããŒããäœæããããã®äŸ¿å©ãªãã€ã³ãïŒ
- æŒãããŠããªãããŒãæããšããââæŒããããšãããããã¯éåžžããæãèŠããã¯ãã§ããããšãèŠããŠãããŠãã ããã é»ã®ããŒãæŒãããŠããªãç¶æ
ã§æåéãé»ã®å Žåããããå€ãæŒãããããšè¡šçŸããããšã¯å°é£ã§ãã
- çœãããŒã¯ãã¹ãŠé»ãããŒãšåãå¹
ã§ãã
- æŒããããã©ãŒã Doããã³FaïŒCããã³FïŒã§ã¯ãMiããã³CïŒEããã³BïŒãšåãããã«-ããã¯åãç»åã§ãã æåã®ã·ã£ãŒããš2çªç®ã®ãã©ããã®ãªãã»ãããåãã§ããããšã確èªããŠãã ãããåãã§ãªãå Žåãã¬ã€ã€ãŒãšã®ã£ããã衚瀺ãããŸãã
- ããŒã¹ãããŒã¯ãæããšãã¯ãåéæã®ãªãŒããŒã¬ã€ã䜿çšããªãã§ãã ããã ãã¹ã¯ã¬ã€ã€ãŒã䜿çšããŠãæŒãããåããŒãç»åé åã®ã¿ãå€æŽããããã«ããŸãã
IKeyboardControl
ã䜿çšãã圱ãå€éšã°ããŒãªã©ã®å¹æã¯ãæ£ãã衚瀺ã§ããŸããã IKeyboardControl
ã®æé«ããŒã¯Upã§ãã ãã®ãããäžéšã«é»ãããŒã®ãªãçœãããŒãå¿
èŠã§ãã éç Žå£çã«äœæ¥ããå Žåãããã¯äœæ¥ã«ãªããŸããã
å¥ã®å°ããªãã³ãïŒã·ã³ã»ã®ããŽã«ã¯ãæåSã3ååºçŸããŸãã ãã®ãã©ã³ãã®æåã¯äžèŠåãªãã¯ã¹ãã£ãæã£ãŠããããã3ã€ã®ãŸã£ããåãæåSã¯å®å
šã«äžèªç¶ã«èŠããŸãã ããŽã®èŠæ ããè¯ãããã«ã¯ããã¹ã¯ä»ãã®è¿œå ã¬ã€ã€ãŒã䜿çšããŸããããã«ãããè€æ°ã®å Žæã§åãæåã®ãã¯ã¹ãã£ããããã«å€æŽã§ããŸãã
ã°ã©ãã£ãã¯ã¹ã®ãšã¯ã¹ããŒã
ã€ã³ã¿ãŒãã§ã€ã¹ã³ã³ããŒãã³ãã¯ããã©ã°ã€ã³ã³ãŒãããåç
§ããããã«ãåå¥ã®.pngãšããŠãšã¯ã¹ããŒãããå¿
èŠããããŸãã æåã§ãšã¯ã¹ããŒããããã次ã®6ã€ã®ãã¡ã€ã«ãããŠã³ããŒãã§ããŸãã
GUIã®å®è£
ãã€ãã®ããã«ãå€ãè¯ãè¶
䟿å©ãªè€è£œã¹ã¯ãªããã䜿çšããŠ
åæãããžã§ã¯ããã³ããŒããŸãã
IPlugExamplesãã©ã«ããŒããå®è¡ããŸãã
cd ~/plugin-development/wdl-ol/IPlugExamples/
./duplicate.py Synthesis/ SpaceBass YourName
以åã®æçš¿ã§éçºãè¡ã£ãŠããªãå Žåã¯
ããããžã§ã¯ãã
ããŠã³ããŒãããŠè§£åãã
duplicate
ã¹ã¯ãªãããå®è¡
duplicate
ãŸãã
6ã€ã®ç»åãã¹ãŠããããžã§ã¯ããªãœãŒã¹ãã©ã«ããŒã«ã³ããŒããäžèŠã«ãªã£ã
knob_small.pngãåé€ããŸãã
åããã¡ã€ã«åã䜿çšããŠããããã
resource.hããããã«å€æŽããã ã
ã§ã ã
KNOB_SMALL_ID
ããã³
KNOB_SMALL_FN
åé€ã
KNOB_SMALL_FN
ã ãã¡ã€ã«ããããŒã¯æ¬¡ã®ããã«ãªããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ãå°ã倧ãããªããŸããïŒ
å¥ã®ãªãœãŒã¹ãã¡ã€ã«
SpaceBass.rcãç·šéããå¿
èŠããããŸãã
#include "resource.h" BG_ID PNG BG_FN WHITE_KEY_ID PNG WHITE_KEY_FN BLACK_KEY_ID PNG BLACK_KEY_FN WAVEFORM_ID PNG WAVEFORM_FN KNOB_ID PNG KNOB_FN FILTERMODE_ID PNG FILTERMODE_FN
ããã§ã¯ã
Oscillator
ã¯ã©ã¹ãå°ãå€æŽããŸãããã
Oscillator::OscillatorMode
ãšããŠå€éšããã¢ã¯ã»ã¹ã§ããããã«ã
enum OscillatorMode
ãã¯ã©ã¹å
ã§ç§»åããŸãã
Filter
ãš
EnvelopeGenerator
ã§ãåãããšãè¡ããŸããããããã§ã¯ã察称æ§ã®ããã«ãè¡ããŸãã
public
ãæåã«ãªãããã«
public
ã»ã¯ã·ã§ã³ãš
private
ã»ã¯ã·ã§ã³ã䞊ã¹æ¿ããŸãã ãããŠã
enum OscillatorMode
ããã®ã»ã¯ã·ã§ã³ã®äžã«ç§»åããŸãã
class Oscillator { public: enum OscillatorMode { OSCILLATOR_MODE_SINE = 0, OSCILLATOR_MODE_SAW, OSCILLATOR_MODE_SQUARE, OSCILLATOR_MODE_TRIANGLE, kNumOscillatorModes }; void setMode(OscillatorMode mode); void setFrequency(double frequency); void setSampleRate(double sampleRate); void generate(double* buffer, int nFrames); inline void setMuted(bool muted) { isMuted = muted; } double nextSample(); Oscillator() : mOscillatorMode(OSCILLATOR_MODE_SINE), mPI(2*acos(0.0)), twoPI(2 * mPI), isMuted(true), mFrequency(440.0), mPhase(0.0), mSampleRate(44100.0) { updateIncrement(); }; private: OscillatorMode mOscillatorMode; const double mPI; const double twoPI; bool isMuted; double mFrequency; double mPhase; double mSampleRate; double mPhaseIncrement; void updateIncrement(); };
次ã«ãGUIã³ãŒãã«çŽæ¥é²ã¿ãŸãããã
SpaceBass.hããå§ããŸãããã
private
é¢æ°ãããã€ãè¿œå ããŸãã
void CreateParams(); void CreateGraphics();
ãããã£ãŠãã€ã³ã¿ãŒãã§ã€ã¹ã³ãŒãã§ã³ã³ã¹ãã©ã¯ã¿ãå§åããããšã¯ãããŸããã ããã«ããéã«ãäžèŠã«ãªã£ãäžèŠãª
double mFrequency
ãåé€ã
double mFrequency
ã
enum EParams
EParamsã®åã«
enum EParams
ã§å®æ°ãè¿œå ããŸãã
const double parameterStep = 0.001;
ãã®ãã©ã¡ãŒã¿ãŒã¯ããŠãŒã¶ãŒãã€ã³ã¿ãŒãã§ã€ã¹ãããåã粟床ã決å®ããŸãã åãã³ã§äœ¿çšãããããããã³ãã«ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠåå¥ã®è¡ã«ç¹å®ã®å€ãæžã蟌ãã®ã§ã¯ãªããããã§1ã€ã®å®æ°ãäœæããããšããå§ãããŸãã
ãã©ã°ã€ã³ã®æ°ããããŒãžã§ã³ã«ã¯ãããå€ãã®ãªãã·ã§ã³ããããŸãã
EParams
ç·šéïŒ
enum EParams {
ãŸãã
ELayout
ããä»®æ³ããŒããŒãã®å Žæãå€æŽãããããã§ãã
enum ELayout { kWidth = GUI_WIDTH, kHeight = GUI_HEIGHT, kKeybX = 62, kKeybY = 425 };
äžç®æã«ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒ
InitDouble()
ããã³
new IKnobMultiControl
ãžã®åŒã³åºããã¹ã¿ã³ããã代ããã«ãGUIæ
å ±ãæ ŒçŽããããã®ç¹å¥ãªããŒã¿æ§é ãäœæããããšãã
new IKnobMultiControl
ããŸãã
EParams
äžã«æ¬¡ã®
struct
äœæããŸãã
typedef struct { const char* name; const int x; const int y; const double defaultVal; const double minVal; const double maxVal; } parameterProperties_struct;
ãã©ã¡ãŒã¿åããã©ã°ã€ã³ãŠã£ã³ããŠå
ã®ã³ã³ãããŒã«ã®åº§æšãããã³ããã©ã«ãå€/æå°å€/æ倧å€ïŒãã©ã¡ãŒã¿ã®ã¿ã€ãã
double
ïŒãä¿åãããŸãã ã¹ã€ããã®å Žåã
default/min/maxVal
ã¯å¿
èŠãããŸããã éçåä»ãã®ãããããã¯äœåãªã²ããã«ãªããŸãã
以äžã§ã¯ããã©ã¡ãŒã¿ããŒã¿ãïŒã»ãŒïŒä¿åããããŒã¿æ§é ãäœæããŸãã ãã©ã¡ãŒã¿ãŒããšã«ã1ã€ã®
parameterProperties_struct
ãå¿
èŠã§ããã€ãŸãããµã€ãº
kNumParams
é
åãå¿
èŠ
kNumParams
ã
const parameterProperties_struct parameterProperties[kNumParams] =
ãã®è¡ã®äžã«å®éã®å€ãæ¿å
¥ããŸãã
Filter Modeãªã©ã®
enum
åã®ãã©ã¡ãŒã¿ãŒã«ã€ããŠã¯ã
default/min/maxVals
ãåæåãããŠããªãããšã«æ³šæããŠãã ããã
{ {.name="Osc 1 Waveform", .x=30, .y=75}, {.name="Osc 1 Pitch Mod", .x=69, .y=61, .defaultVal=0.0, .minVal=0.0, .maxVal=1.0}, {.name="Osc 2 Waveform", .x=203, .y=75}, {.name="Osc 2 Pitch Mod", .x=242, .y=61, .defaultVal=0.0, .minVal=0.0, .maxVal=1.0}, {.name="Osc Mix", .x=130, .y=61, .defaultVal=0.5, .minVal=0.0, .maxVal=1.0}, {.name="Filter Mode", .x=30, .y=188}, {.name="Filter Cutoff", .x=69, .y=174, .defaultVal=0.99, .minVal=0.0, .maxVal=0.99}, {.name="Filter Resonance", .x=124, .y=174, .defaultVal=0.0, .minVal=0.0, .maxVal=1.0}, {.name="Filter LFO Amount", .x=179, .y=174, .defaultVal=0.0, .minVal=0.0, .maxVal=1.0}, {.name="Filter Envelope Amount", .x=234, .y=174, .defaultVal=0.0, .minVal=-1.0, .maxVal=1.0}, {.name="LFO Waveform", .x=30, .y=298}, {.name="LFO Frequency", .x=69, .y=284, .defaultVal=6.0, .minVal=0.01, .maxVal=30.0}, {.name="Volume Env Attack", .x=323, .y=61, .defaultVal=0.01, .minVal=0.01, .maxVal=10.0}, {.name="Volume Env Decay", .x=378, .y=61, .defaultVal=0.5, .minVal=0.01, .maxVal=15.0}, {.name="Volume Env Sustain", .x=433, .y=61, .defaultVal=0.1, .minVal=0.001, .maxVal=1.0}, {.name="Volume Env Release", .x=488, .y=61, .defaultVal=1.0, .minVal=0.01, .maxVal=15.0}, {.name="Filter Env Attack", .x=323, .y=174, .defaultVal=0.01, .minVal=0.01, .maxVal=10.0}, {.name="Filter Env Decay", .x=378, .y=174, .defaultVal=0.5, .minVal=0.01, .maxVal=15.0}, {.name="Filter Env Sustain", .x=433, .y=174, .defaultVal=0.1, .minVal=0.001, .maxVal=1.0}, {.name="Filter Env Release", .x=488, .y=174, .defaultVal=1.0, .minVal=0.01, .maxVal=15.0} };
倧èŠæš¡ãªä»æãã äžæ¬åŒ§
{}
ã䜿çšããåæ§ã®æ§æã¯ãã
è€åãªãã©ã« ããšåŒã°ããC / C ++ã®æ¯èŒçæ°ããææ³ã§ãåºæ¬çãªèãæ¹ã¯ããã®æ¹æ³ã§æ§é ãšé
åãåæåã§ããããšã§ãã å€éšæ¬åŒ§ã¯
parameterProperties[]
é
åãåæåã
parameterProperties[]
;ãããã¯ã³ã³ãã§åºåãããè€åãªãã©ã«ã®ãªã¹ããå«ã¿ãããããã1ã€ã®
parameterProperties_struct
ãåæåã
parameterProperties_struct
ã æåã®ãªãã©ã«ãäŸãšããŠäœ¿çšããŠããããèŠãŠã¿ãŸãããã
{.name="Osc 1 Waveform", .x=30, .y=75}
å€ãåŠæ ¡ã®ã¢ãããŒãã¯ãããæžãããšã§ãïŒ
parameterProperties_struct* osc1Waveform_prop = parameterProperties[mOsc1Waveform]; osc1Waveform_prop->name = "Osc 1 Waveform"; osc1Waveform_prop->x = 30; osc1Waveform_prop->y = 75;
ããã¯ãåãã©ã¡ãŒã¿ãŒã«å¯ŸããŠè¡ãå¿
èŠããããŸãïŒ
struct
æ§é ã®è€åãªãã©ã«ãžã®ãã¯ã©ã·ãã¯ãã¢ãããŒãã¯æ¬¡ã®ãšããã§ãã
{"Osc 1 Waveform", 30, 75}
éåžžã«ç°¡æœã§ããããšã©ãŒãçºçããããã
struct
ã®äžéšã«äœããè¿œå ããããèŠçŽ ã®é åºãå€æŽãããšãåé¡ãçºçããŸãã
æå®ããã€ãã·ã£ã©ã€ã¶ã䜿çšããããšããå§ãããŸãããããã«å
¥åããå¿
èŠããããŸãã ãã®å·šå€§ãªãã¬ãŒãºã¯ãåã«æ§æ
.membername=
ã䜿çšããŠ
struct
èŠçŽ ã«ã¢ã¯ã»ã¹ã§ããããšãæå³ããŸãã æçµçãªåœ¢åŒã§ã¯ãããã¯
JSONãŸãã¯
Rubyã®ããã·ã¥ã«å°ã䌌ãŠã
ãŸã ã
{.name="Osc 1 Waveform", .x=30, .y=75}
ãã©ã¡ãŒã¿ãäœæãã
CreateGraphics
ãš
CreateGraphics
2ã€ã®ã¡ã³ããŒ
CreateParams
ãè¿œå ããŸããã ããã§ãã³ã³ã¹ãã©ã¯ã¿ã¯éåžžã«ã·ã³ãã«ã«èŠããŸãã
SpaceBass::SpaceBass(IPlugInstanceInfo instanceInfo) : IPLUG_CTOR(kNumParams, kNumPrograms, instanceInfo), lastVirtualKeyboardNoteNumber(virtualKeyboardMinimumNoteNumber - 1) { TRACE; CreateParams(); CreateGraphics(); CreatePresets(); mMIDIReceiver.noteOn.Connect(this, &SpaceBass::onNoteOn); mMIDIReceiver.noteOff.Connect(this, &SpaceBass::onNoteOff); mEnvelopeGenerator.beganEnvelopeCycle.Connect(this, &SpaceBass::onBeganEnvelopeCycle); mEnvelopeGenerator.finishedEnvelopeCycle.Connect(this, &SpaceBass::onFinishedEnvelopeCycle); }
ãã¹ãŠãéæã§ãããïŒ ããã§
GetParam()
ãš
pGraphics
GetParam()
代ããã«ããã¹ãŠãåãåºããŸããã
CreateParams
æžããŸãããïŒ
void SpaceBass::CreateParams() { for (int i = 0; i < kNumParams; i++) { IParam* param = GetParam(i); const parameterProperties_struct& properties = parameterProperties[i]; switch (i) {
ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒãå埩åŠçããŸãã æåã«ãäœæããããŒã¿æ§é ããå¿
èŠãªããããã£ãååŸãã次ã«
switch
䜿çšããŠç°ãªã
enum
switch
åæåããŸãã LFOã®å Žåãäžè§æ³¢åœ¢ãããã©ã«ãã§éžæãããŸããããã¯ãæãé »ç¹ã«äœ¿çšãããããã§ãã 16åãã¹ãŠã®ãã³ã«å¯ŸããŠ1ã€ã®åŒãã䜿çšããªãããšã«æ³šæããŠãã ããïŒ
äžéšã®ãã³ã§ã¯ãéç·åœ¢åäœãæå®ããæ¹ãé©åã§ãã ããšãã°ããªã¯ã¿ãŒãåäœã®é³ãšãã®åšæ³¢æ°ã®æ°åŠçé¢ä¿ã«ãããã«ãããªãåšæ³¢æ°ã察æ°çã«å€æŽããããšããå§ãããŸãã
SetShape
ã®æåŸã«é©åãª
SetShape
åŒã³åºããè¿œå ããŸãã
GetParam(mFilterCutoff)->SetShape(2); GetParam(mVolumeEnvAttack)->SetShape(3); GetParam(mFilterEnvAttack)->SetShape(3); GetParam(mVolumeEnvDecay)->SetShape(3); GetParam(mFilterEnvDecay)->SetShape(3); GetParam(mVolumeEnvSustain)->SetShape(2); GetParam(mFilterEnvSustain)->SetShape(2); GetParam(mVolumeEnvRelease)->SetShape(3); GetParam(mFilterEnvRelease)->SetShape(3);
æåŸã«ãåãã©ã¡ãŒã¿ãŒã«ã€ããŠã
OnParamChange
1ååŒã³åºãå¿
èŠããããŸããããã«ããããã©ã°ã€ã³ãæåã«åŒã³åºããããšãã«ãå
éšå€æ°ã«æ£ããå€ãèšå®ãããŸãã
for (int i = 0; i < kNumParams; i++) { OnParamChange(i); } }
å
éšãã©ã¡ãŒã¿ãŒãå®æãããããããã®ã³ã³ãããŒã«ãè¿œå ããŸãã ããã¯
CreateGraphics
ã®æ¬äœã§è¡ãã
CreateGraphics
ã ãŸããèæ¯ç»åãè¿œå ããŸãã
void SpaceBass::CreateGraphics() { IGraphics* pGraphics = MakeGraphics(this, kWidth, kHeight); pGraphics->AttachBackground(BG_ID, BG_FN);
次ã«ããŒããŒãïŒ
IBitmap whiteKeyImage = pGraphics->LoadIBitmap(WHITE_KEY_ID, WHITE_KEY_FN, 6); IBitmap blackKeyImage = pGraphics->LoadIBitmap(BLACK_KEY_ID, BLACK_KEY_FN);
ããŒããŒãã§å€æŽãããå¯äžã®ãã®ã¯ããªã¯ã¿ãŒãã®æ°ïŒçŸåšã¯4
keyCoordinates
ïŒãš
keyCoordinates
ã§ãã æ°ããããŒã¯å¹
ãåºããããæŒãããããŒãé©åãªåº§æšã§è¡šç€ºãããããã«ããããã®éã®ã¹ãããã調æŽããå¿
èŠããããŸãã
次ã«ããããšã¹ã€ããã®ç»åãã¢ããããŒãããŸãã
IBitmap waveformBitmap = pGraphics->LoadIBitmap(WAVEFORM_ID, WAVEFORM_FN, 4); IBitmap filterModeBitmap = pGraphics->LoadIBitmap(FILTERMODE_ID, FILTERMODE_FN, 3); IBitmap knobBitmap = pGraphics->LoadIBitmap(KNOB_ID, KNOB_FN, 64);
ãã€ãã®ããã«ãããã§ã¯
.pngãããŒãããããããã«ããã€ã®ãã¬ãŒã ãããããã·ã¹ãã ã«äŒããŸãã
äž»ãªéšåã¯ããã¹ãŠã®ãã©ã¡ãŒã¿ãŒãå埩åŠçããŠé©åãªã³ã³ãããŒã«ãäœæããããšã§ãã
for (int i = 0; i < kNumParams; i++) { const parameterProperties_struct& properties = parameterProperties[i]; IControl* control; IBitmap* graphic; switch (i) {
ããã§ã¯ããŸãçŸåšã®ãã©ã¡ãŒã¿ãŒã®ããããã£ãèŠã€ããŠãããç¹å®ã®å Žåã«
switch
ã䜿çšããŸãã ãŸããããã§ã¯ã
waveform.pngã®ä»£ããã«ã
filterMode.pngã mFilterModeãã©ã¡ãŒã¿ãŒã«äœ¿çšãããŸãã ç¹°ãè¿ã
ãŸããã
ããã©ã«ãã¯ãã³ãã«ã®ã³ãŒãã§ãããã³ãã«ã¯ã»ãšãã©ã®å Žåã³ã³ãããŒã«ã®äžã«ããããã§ãã
AttachGraphics
ãåŒã³åºããŠãé¢æ°æ¬äœãå®æãããŸãã
AttachGraphics(pGraphics); }
æåŸã«ã
OnParamChange()
ãã
switch
ãåé€ã
ãŸã ã 次åã¯æžãçŽããŸãã
ã§ããïŒ
ãã©ã°ã€ã³ãèµ·åããŠãæ°ããã€ã³ã¿ãŒãã§ãŒã¹ããã¹ãŠã楜ãã¿ãã ããïŒ ç¢ºãã«ãé³ã¯ãŸã æ©èœããŠããŸãã-次åã¯ãããè¡ããŸãã ã·ã³ã»ãµã€ã¶ãŒãããªãã©ããã¯ã«ããå¿
èŠããããŸãïŒ
ã³ãŒãã¯
ããããããŠã³ããŒãã§ã
ãŸã ã
å
ã®æçš¿ ã