desc:GFX G M1K //tags: instrument synth poly analogue rack chorus delay //author: JGWizrad / Garden FX (GFX) // // Requires gfx-drift, gfx-output, gfx-ui, gfx-panel, gfx-instrument, gfx-voice, gfx-dyn and gfx-faceplate // (.jsfx-inc) in the same folder. // // A six-voice analogue rack module in the spirit of the late-80s matrix-modulation synths: a single-space // box full of patches, with a full editor behind the EDIT key. // VOICE two DCOs each: a SAW that morphs to TRIANGLE (SHAPE) and a PULSE (PW), switched in independently; // DCO 2 adds NOISE (in place of its waves) and SYNC to DCO 1; MIX balances the two. // 24 dB low-pass VCF: CUTOFF, RESONANCE, ENV 1 amount, KEY tracking and FM (DCO 1 sweeping the cutoff). // VCA 1 = velocity and level; VCA 2 = ENV 2. // VCF VEL: velocity opens the cutoff (up to +5 oct). // Two DADSR envelopes: ENV 1 -> VCF (and PITCH: DCO 2 or both, +/-24 st), ENV 2 -> VCA. // LFO 1 -> vibrato, with DELAY (fades in after each note); mod wheel and aftertouch add vibrato. // LFO 2 -> PW, CUTOFF (+/-5 oct) or PITCH (+/-12 st). // MOD RACK the GFX Mod Rack inside: CHORUS, TREMOLO, VIBE and DELAY, each with L / C / R outputs and tempo SYNC. // Every patch carries its own Mod Rack setting. // PATCHES 100 factory patches in seven banks (KEYBOARD, STRINGS, WIND+PERC, SYNTH, BASS, LEAD, EFFECTS). // Choosing a patch loads every voice setting (your edits stay until you choose another patch - // save them as a Reaper preset). // PLAY POLY (6 voices), MONO (legato, last note) or UNISON (all six voices on one note, spread). // GLIDE, VELOCITY, BEND range, VOLUME, MIDI channel. // DRIFT (GFX instrument standard): the tuning wanders, each voice's DCOs drift apart in fine pitch and pulse // width, the filter breathes, and every note lands slightly differently in tune. // MIDI: pitch bend, CC1 mod wheel, channel aftertouch, CC64 sustain, CC123 all notes off. // FACEPLATE black (the early boxes) or cream (the 90s boxes): the key beside the display swaps them. import gfx-drift.jsfx-inc import gfx-output.jsfx-inc import gfx-ui.jsfx-inc import gfx-panel.jsfx-inc import gfx-instrument.jsfx-inc import gfx-voice.jsfx-inc import gfx-dyn.jsfx-inc import gfx-faceplate.jsfx-inc slider1:0<0,99,1>-Patch slider2:0<-24,6,0.1>-Volume (dB) slider3:25<0,100,1>-Drift (%) slider4:0<0,16,1>-MIDI channel (0 = omni) slider5:0<0,2,1{Poly,Mono,Unison}>-Voice mode slider6:0<0,1000,1>-Glide (ms) slider7:50<0,100,1>-Velocity (%) slider8:2<0,12,1>-Bend range (st) slider9:0<-24,24,1>-DCO 1 freq (st) slider10:0<0,100,1>-DCO 1 shape (saw - tri) slider11:1<0,1,1{Off,On}>-DCO 1 wave slider12:0<0,1,1{Off,On}>-DCO 1 pulse slider13:50<5,95,1>-DCO 1 PW (%) slider14:0<-24,24,1>-DCO 2 freq (st) slider15:7<-50,50,0.1>-DCO 2 detune (cents) slider16:0<0,100,1>-DCO 2 shape (saw - tri) slider17:1<0,1,1{Off,On}>-DCO 2 wave slider18:0<0,1,1{Off,On}>-DCO 2 pulse slider19:50<5,95,1>-DCO 2 PW (%) slider20:0<0,1,1{Off,On}>-DCO 2 noise slider21:0<0,1,1{Off,On}>-Sync slider22:50<0,100,1>-Mix (%) slider23:2000<20,18000,1>-Cutoff (Hz) slider24:15<0,100,1>-Resonance (%) slider25:40<-100,100,1>-VCF env 1 (%) slider26:50<0,100,1>-VCF key track (%) slider27:0<0,100,1>-VCF FM (%) slider28:0<0,3000,1>-Env 1 delay (ms) slider29:2<0.5,8000,0.1>-Env 1 attack (ms) slider30:400<5,10000,1>-Env 1 decay (ms) slider31:40<0,100,1>-Env 1 sustain (%) slider32:300<5,10000,1>-Env 1 release (ms) slider33:0<0,3000,1>-Env 2 delay (ms) slider34:2<0.5,8000,0.1>-Env 2 attack (ms) slider35:300<5,10000,1>-Env 2 decay (ms) slider36:90<0,100,1>-Env 2 sustain (%) slider37:300<5,10000,1>-Env 2 release (ms) slider43:5<0.05,30,0.01>-LFO 1 speed (Hz) slider44:0<0,5,1{Triangle,Saw up,Saw down,Square,Random,Noise}>-LFO 1 wave slider45:0<0,100,1>-LFO 1 vibrato (cents) slider46:0.6<0.05,30,0.01>-LFO 2 speed (Hz) slider47:0<0,5,1{Triangle,Saw up,Saw down,Square,Random,Noise}>-LFO 2 wave slider48:0<0,100,1>-LFO 2 depth (%) slider66:0<0,100,1>-Band sat (%) slider67:30<0,100,1>-Bias (%) slider68:120<40,400,1>-Sat low band (Hz) slider69:6000<2000,16000,10>-Sat high band (Hz) slider70:-0.3<-24,0,0.1>-Ceiling / limit threshold (dB) slider71:1<0,2,1{Off,Clip,Limit}>-Output stage slider72:0<-12,6,0.1>-Patch level (dB) slider73:0<0,100,1>-VCF velocity (%) slider74:0<0,5000,1>-LFO 1 delay (ms) slider75:0<0,2,1{PW,Cutoff,Pitch}>-LFO 2 destination slider76:0<-24,24,0.1>-Env 1 to pitch (st) slider77:0<0,1,1{DCO 2,Both}>-Pitch env target slider80:0.8<0.05,8,0.01>-FX chorus rate (Hz) slider81:50<0,100,1>-FX chorus depth (%) slider82:0<0,100,1>-FX chorus mix (%) slider83:0<0,100,1>-FX chorus clock stretch (%) slider84:1<0,1,1{Off,On}>-FX chorus L slider85:0<0,1,1{Off,On}>-FX chorus C slider86:1<0,1,1{Off,On}>-FX chorus R slider87:0<0,3,1{Off,Straight,Dotted,Triplet}>-FX chorus sync slider88:2<0,7,1{4 Bars,2 Bars,1 Bar,1/2,1/4,1/8,1/16,1/32}>-FX chorus sync rate slider90:4<0.1,15,0.01>-FX tremolo rate (Hz) slider91:0<0,100,1>-FX tremolo depth (%) slider93:0<0,100,1>-FX tremolo square chop (%) slider94:1<0,1,1{Off,On}>-FX tremolo L slider95:0<0,1,1{Off,On}>-FX tremolo C slider96:1<0,1,1{Off,On}>-FX tremolo R slider97:0<0,3,1{Off,Straight,Dotted,Triplet}>-FX tremolo sync slider98:5<0,7,1{4 Bars,2 Bars,1 Bar,1/2,1/4,1/8,1/16,1/32}>-FX tremolo sync rate slider100:1.5<0.1,12,0.01>-FX vibe rate (Hz) slider101:0<0,100,1>-FX vibe depth (%) slider103:0<0,100,1>-FX vibe asymmetrical lamp (%) slider104:1<0,1,1{Off,On}>-FX vibe L slider105:0<0,1,1{Off,On}>-FX vibe C slider106:1<0,1,1{Off,On}>-FX vibe R slider107:0<0,3,1{Off,Straight,Dotted,Triplet}>-FX vibe sync slider108:4<0,7,1{4 Bars,2 Bars,1 Bar,1/2,1/4,1/8,1/16,1/32}>-FX vibe sync rate slider110:350<20,1500,1>-FX delay time (ms) slider111:30<0,95,1>-FX delay feedback (%) slider112:0<0,100,1>-FX delay mix (%) slider113:0<0,100,1>-FX delay runaway clock (%) slider114:1<0,1,1{Off,On}>-FX delay L slider115:0<0,1,1{Off,On}>-FX delay C slider116:1<0,1,1{Off,On}>-FX delay R slider117:0<0,3,1{Off,Straight,Dotted,Triplet}>-FX delay sync slider118:4<0,7,1{4 Bars,2 Bars,1 Bar,1/2,1/4,1/8,1/16,1/32}>-FX delay sync rate in_pin:none out_pin:left output out_pin:right output @init #ui_man = "gfx-g-m1k"; NV = 6; VN = 50000; VG = 50010; VT = 50020; VS = 50030; // per voice: note (-1 free), gate, age, held by sustain HN = 50100; // mono: held-note stack EQO = 50300; EQT = 50600; EQN = 50900; EQV = 51200; // note event queue (300 each) PB = 60000; // patch bank: 100 x 128 PSL = 59100; // the slider behind each patch field MR = 200000; // Mod Rack lines gi = 0; loop(NV, VN[gi] = -1; VG[gi] = 0; VT[gi] = 0; VS[gi] = 0; gi += 1; ); function pp(p, j, a, b, c, d, e, f, g, h, i, k) local(o) ( o = PB + p*128 + j; o[0] = a; o[1] = b; o[2] = c; o[3] = d; o[4] = e; o[5] = f; o[6] = g; o[7] = h; o[8] = i; o[9] = k; ); function pn(p, s) ( strcpy(100 + p, s); ); NPF = 77; PSL[0] = 9; PSL[1] = 10; PSL[2] = 11; PSL[3] = 12; PSL[4] = 13; PSL[5] = 14; PSL[6] = 15; PSL[7] = 16; PSL[8] = 17; PSL[9] = 18; PSL[10] = 19; PSL[11] = 20; PSL[12] = 21; PSL[13] = 22; PSL[14] = 23; PSL[15] = 24; PSL[16] = 25; PSL[17] = 26; PSL[18] = 27; PSL[19] = 28; PSL[20] = 29; PSL[21] = 30; PSL[22] = 31; PSL[23] = 32; PSL[24] = 33; PSL[25] = 34; PSL[26] = 35; PSL[27] = 36; PSL[28] = 37; PSL[29] = 43; PSL[30] = 44; PSL[31] = 45; PSL[32] = 46; PSL[33] = 47; PSL[34] = 48; PSL[35] = 73; PSL[36] = 74; PSL[37] = 75; PSL[38] = 76; PSL[39] = 77; PSL[40] = 72; PSL[41] = 5; PSL[42] = 6; PSL[43] = 80; PSL[44] = 81; PSL[45] = 82; PSL[46] = 83; PSL[47] = 84; PSL[48] = 85; PSL[49] = 86; PSL[50] = 87; PSL[51] = 88; PSL[52] = 90; PSL[53] = 91; PSL[54] = 93; PSL[55] = 94; PSL[56] = 95; PSL[57] = 96; PSL[58] = 97; PSL[59] = 98; PSL[60] = 100; PSL[61] = 101; PSL[62] = 103; PSL[63] = 104; PSL[64] = 105; PSL[65] = 106; PSL[66] = 107; PSL[67] = 108; PSL[68] = 110; PSL[69] = 111; PSL[70] = 112; PSL[71] = 113; PSL[72] = 114; PSL[73] = 115; PSL[74] = 116; PSL[75] = 117; PSL[76] = 118; // banks: first patch of each, and their names function cat_start(c) ( c == 0 ? 0 : c == 1 ? 16 : c == 2 ? 30 : c == 3 ? 42 : c == 4 ? 62 : c == 5 ? 76 : c == 6 ? 88 : 100; ); function cat_of(p) local(c) ( c = 0; loop(6, p >= cat_start(c + 1) ? c += 1; ); c; ); function cat_name(c) ( c == 0 ? "KEYBOARD" : c == 1 ? "STRINGS" : c == 2 ? "WIND+PERC" : c == 3 ? "SYNTH" : c == 4 ? "BASS" : c == 5 ? "LEAD" : "EFFECTS"; ); function lfo_name(w) ( w == 0 ? "TRIANGLE" : w == 1 ? "SAW UP" : w == 2 ? "SAW DOWN" : w == 3 ? "SQUARE" : w == 4 ? "RANDOM" : "NOISE"; ); // ---------- factory bank ---------- pp(0, 0, 0, 0, 0, 1, 30, 0, 4, 0, 1, 0); pp(0, 10, 50, 0, 0, 40, 900, 5, 55, 80, 0, 0); pp(0, 20, 1, 900, 10, 400, 0, 1, 1800, 0, 450, 5); pp(0, 30, 0, 0, 0.6, 0, 0, 30, 0, 0, 0, 0); pp(0, 40, -6, 0, 0, 0.5, 40, 25, 0, 1, 0, 1); pp(0, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(0, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(0, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(0, "RACK PIANO"); pp(1, 0, 0, 0, 0, 1, 18, 12, 3, 0, 0, 1); pp(1, 10, 40, 0, 0, 35, 700, 10, 60, 70, 0, 0); pp(1, 20, 1, 600, 15, 400, 0, 1, 2500, 0, 500, 4.5); pp(1, 30, 0, 0, 0.6, 0, 0, 45, 0, 0, 0, 0); pp(1, 40, -6, 0, 0, 0.5, 40, 25, 0, 1, 0, 1); pp(1, 50, 0, 2, 0.6, 16, 0, 1, 0, 1, 0, 5); pp(1, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(1, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(1, "DYNO KEYS"); pp(2, 0, 0, 0, 0, 1, 12, 0, 2, 0, 0, 1); pp(2, 10, 22, 0, 0, 50, 1600, 40, 50, 60, 0, 0); pp(2, 20, 1, 180, 10, 80, 0, 1, 700, 30, 60, 5); pp(2, 30, 0, 0, 0.6, 0, 0, 50, 0, 0, 0, 0); pp(2, 40, 3.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(2, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(2, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(2, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(2, "CLAV KEYS"); pp(3, 0, 0, 0, 0, 1, 50, 12, 1, 0, 0, 1); pp(3, 10, 50, 0, 0, 45, 4000, 0, 0, 60, 0, 0); pp(3, 20, 2, 400, 40, 300, 0, 2, 100, 100, 60, 6.5); pp(3, 30, 0, 6, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(3, 40, -5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(3, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(3, 60, 5.5, 35, 20, 1, 0, 1, 0, 4, 350, 30); pp(3, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(3, "HOLLOW ORGAN"); pp(4, 0, 0, 100, 1, 0, 50, 19, 0, 100, 1, 0); pp(4, 10, 50, 0, 0, 30, 5000, 0, 0, 50, 0, 0); pp(4, 20, 1, 250, 0, 100, 0, 1, 100, 100, 80, 5); pp(4, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(4, 40, -2, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(4, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(4, 60, 5.5, 35, 20, 1, 0, 1, 0, 4, 350, 30); pp(4, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(4, "PERC ORGAN"); pp(5, 0, 0, 0, 1, 0, 50, 12, 2, 0, 0, 1); pp(5, 10, 15, 0, 0, 45, 3000, 20, 30, 80, 0, 0); pp(5, 20, 1, 500, 30, 200, 0, 1, 1600, 0, 250, 5); pp(5, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(5, 40, 2.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(5, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(5, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(5, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(5, "HARPSICHORD"); pp(6, 0, 0, 100, 0, 0, 50, 24, 4, 0, 1, 0); pp(6, 10, 50, 0, 1, 40, 2400, 10, 30, 50, 0, 0); pp(6, 20, 1, 800, 20, 500, 0, 1, 2400, 0, 700, 5); pp(6, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 2.7, 0); pp(6, 40, 4, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(6, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(6, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(6, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(6, "BELL PIANO"); pp(7, 0, 0, 100, 1, 0, 50, 24, 0, 100, 1, 0); pp(7, 10, 50, 0, 0, 25, 3000, 0, 10, 50, 0, 0); pp(7, 20, 2, 400, 40, 300, 0, 1, 2500, 0, 900, 5); pp(7, 30, 0, 0, 5.5, 0, 0, 0, 0, 0, 0, 0); pp(7, 40, -6, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(7, 50, 0, 2, 5.5, 50, 0, 1, 0, 1, 0, 5); pp(7, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(7, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(7, "VIBRAPHONE"); pp(8, 0, 0, 0, 0, 1, 45, 0, 5, 100, 1, 0); pp(8, 10, 50, 0, 0, 50, 1100, 5, 25, 50, 0, 0); pp(8, 20, 2, 1200, 30, 600, 0, 2, 3000, 10, 700, 5); pp(8, 30, 0, 0, 3.8, 0, 0, 30, 0, 0, 0, 0); pp(8, 40, -4.5, 0, 0, 0.5, 40, 25, 0, 1, 0, 1); pp(8, 50, 0, 2, 3.8, 24, 0, 1, 0, 1, 0, 5); pp(8, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(8, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(8, "SOFT EP"); pp(9, 0, 0, 0, 1, 0, 50, 0, 12, 0, 1, 0); pp(9, 10, 50, 0, 0, 50, 1800, 30, 55, 50, 0, 0); pp(9, 20, 1, 250, 20, 150, 0, 1, 350, 40, 120, 5); pp(9, 30, 0, 0, 0.6, 0, 0, 30, 0, 0, 0, 0); pp(9, 40, 3, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(9, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(9, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(9, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(9, "STAB KEYS"); pp(10, 0, 0, 0, 0, 1, 25, 31, 0, 0, 0, 1); pp(10, 10, 25, 0, 0, 35, 5000, 5, 0, 50, 0, 0); pp(10, 20, 2, 400, 40, 300, 0, 1, 600, 0, 300, 5); pp(10, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(10, 40, 0, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(10, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(10, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(10, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(10, "TOY PIANO"); pp(11, 0, 0, 0, 0, 1, 35, 0, 3, 60, 1, 0); pp(11, 10, 50, 0, 0, 40, 1300, 20, 45, 50, 0, 0); pp(11, 20, 1, 500, 20, 300, 0, 1, 1500, 25, 350, 5); pp(11, 30, 0, 0, 5, 0, 0, 60, 0, 0, 0, 0); pp(11, 40, -1.5, 0, 0, 0.5, 40, 25, 0, 1, 0, 1); pp(11, 50, 0, 2, 5, 30, 0, 1, 0, 1, 0, 5); pp(11, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(11, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(11, "WURLY"); pp(12, 0, 0, 100, 1, 0, 50, 7, 0, 100, 1, 0); pp(12, 10, 50, 0, 0, 40, 3500, 0, 0, 50, 0, 0); pp(12, 20, 2, 400, 40, 300, 0, 30, 100, 100, 700, 5); pp(12, 30, 0, 4, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(12, 40, -2.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(12, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(12, 60, 5.5, 35, 20, 1, 0, 1, 0, 4, 350, 30); pp(12, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(12, "CHURCH KEYS"); pp(13, 0, 0, 0, 1, 0, 50, 12, 7, 0, 1, 0); pp(13, 10, 50, 0, 1, 55, 4000, 5, 0, 50, 0, 0); pp(13, 20, 1, 1200, 0, 600, 0, 1, 2000, 0, 800, 5); pp(13, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 7.2, 0); pp(13, 40, -3, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(13, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(13, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(13, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(13, "GLASS PIANO"); pp(14, 0, 0, 0, 0, 1, 8, 0, 4, 0, 0, 1); pp(14, 10, 20, 0, 0, 50, 600, 55, 70, 50, 0, 0); pp(14, 20, 1, 140, 0, 80, 0, 1, 500, 40, 50, 5); pp(14, 30, 0, 0, 0.6, 0, 0, 60, 0, 0, 0, 0); pp(14, 40, 0.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(14, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(14, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(14, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(14, "FUNKY CLAV"); pp(15, 0, 0, 100, 1, 0, 50, 24, 1, 100, 1, 0); pp(15, 10, 50, 0, 0, 40, 6000, 0, 0, 50, 0, 0); pp(15, 20, 2, 400, 40, 300, 0, 1, 1200, 0, 600, 5); pp(15, 30, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0); pp(15, 40, -1.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(15, 50, 0, 2, 7, 20, 0, 1, 0, 1, 0, 5); pp(15, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 320, 25); pp(15, 70, 15, 0, 1, 0, 1, 1, 4, 0, 0, 0); pn(15, "MUSIC BOX"); pp(16, 0, 0, 0, 1, 0, 50, 0, 9, 0, 1, 0); pp(16, 10, 50, 0, 0, 50, 2600, 5, 15, 40, 0, 0); pp(16, 20, 600, 1500, 70, 1200, 0, 500, 1000, 95, 1400, 5.3); pp(16, 30, 0, 4, 0.4, 0, 10, 0, 0, 0, 0, 0); pp(16, 40, -1.5, 0, 0, 0.6, 50, 35, 0, 1, 0, 1); pp(16, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(16, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(16, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(16, "RACK STRINGS"); pp(17, 0, 0, 0, 1, 0, 50, 0, 9, 0, 1, 0); pp(17, 10, 50, 0, 0, 50, 2600, 5, 15, 40, 0, 0); pp(17, 20, 1500, 2000, 70, 2000, 0, 1400, 1000, 95, 2200, 5.3); pp(17, 30, 0, 4, 0.4, 0, 10, 0, 0, 0, 0, 0); pp(17, 40, -1, 0, 0, 0.6, 50, 35, 0, 1, 0, 1); pp(17, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(17, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(17, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(17, "SLOW STRINGS"); pp(18, 0, 0, 0, 0, 1, 45, 0, 6, 0, 0, 1); pp(18, 10, 55, 0, 0, 50, 2600, 5, 15, 40, 0, 0); pp(18, 20, 600, 1500, 70, 1200, 0, 500, 1000, 95, 1400, 5.3); pp(18, 30, 0, 4, 0.7, 0, 35, 0, 0, 0, 0, 0); pp(18, 40, -4.5, 0, 0, 0.6, 50, 35, 0, 1, 0, 1); pp(18, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(18, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(18, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(18, "PWM ENSEMBLE"); pp(19, 0, 0, 0, 1, 0, 50, 0, 5, 0, 1, 0); pp(19, 10, 50, 0, 0, 50, 1800, 5, 15, 40, 0, 0); pp(19, 20, 300, 800, 60, 700, 0, 250, 800, 90, 800, 5.3); pp(19, 30, 0, 4, 0.4, 0, 10, 0, 0, 0, 0, 0); pp(19, 40, -2, 0, 0, 0.6, 50, 35, 0, 1, 0, 1); pp(19, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(19, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(19, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(19, "CHAMBER"); pp(20, 0, 0, 0, 1, 0, 50, 12, 9, 0, 1, 0); pp(20, 10, 50, 0, 0, 50, 4200, 15, 15, 40, 0, 0); pp(20, 20, 600, 1500, 70, 1200, 0, 500, 1000, 95, 1400, 5.3); pp(20, 30, 0, 7, 0.4, 0, 10, 0, 0, 0, 0, 0); pp(20, 40, 0.5, 0, 0, 0.6, 50, 35, 0, 1, 0, 1); pp(20, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(20, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(20, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(20, "BRIGHT VIOLINS"); pp(21, 0, -12, 0, 1, 0, 50, -12, 9, 0, 1, 0); pp(21, 10, 50, 0, 0, 50, 1300, 10, 15, 40, 0, 0); pp(21, 20, 200, 900, 60, 600, 0, 180, 800, 90, 700, 5.3); pp(21, 30, 0, 4, 0.4, 0, 10, 0, 0, 0, 0, 0); pp(21, 40, -1.5, 0, 0, 0.6, 50, 35, 0, 1, 0, 1); pp(21, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(21, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(21, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(21, "CELLO SECTION"); pp(22, 0, 0, 0, 1, 0, 50, 12, 4, 0, 1, 0); pp(22, 10, 50, 0, 0, 40, 2600, 5, 15, 40, 0, 0); pp(22, 20, 600, 1500, 70, 1200, 0, 500, 1000, 95, 1400, 5.3); pp(22, 30, 0, 4, 0.4, 0, 10, 0, 0, 0, 0, 0); pp(22, 40, -0.5, 0, 0, 0.6, 50, 35, 0, 1, 0, 1); pp(22, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(22, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(22, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(22, "OCTAVE STRINGS"); pp(23, 0, 0, 0, 0, 1, 50, 12, 9, 0, 1, 0); pp(23, 10, 50, 0, 0, 50, 3500, 5, 15, 40, 0, 0); pp(23, 20, 600, 1500, 70, 1200, 0, 500, 1000, 95, 1400, 5.3); pp(23, 30, 0, 4, 5.5, 0, 8, 0, 0, 2, 0, 0); pp(23, 40, -2.5, 0, 0, 0.6, 50, 35, 0, 1, 0, 1); pp(23, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(23, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(23, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(23, "ENSEMBLE DREAM"); pp(24, 0, 0, 0, 1, 0, 50, 0, 9, 0, 1, 0); pp(24, 10, 50, 0, 0, 50, 2600, 5, 15, 40, 0, 0); pp(24, 20, 600, 1500, 70, 1200, 0, 500, 1000, 95, 1400, 5.3); pp(24, 30, 0, 4, 7, 0, 10, 0, 0, 0, 0, 0); pp(24, 40, -2.5, 0, 0, 0.6, 50, 35, 0, 1, 0, 1); pp(24, 50, 0, 2, 7, 60, 0, 1, 0, 1, 0, 5); pp(24, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(24, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(24, "TREMOLO STRINGS"); pp(25, 0, 0, 0, 1, 0, 50, 0, 9, 0, 1, 0); pp(25, 10, 50, 0, 0, 50, 2600, 5, 40, 40, 0, 0); pp(25, 20, 2500, 1500, 90, 1500, 0, 2000, 1000, 100, 1800, 5.3); pp(25, 30, 0, 4, 0.4, 0, 10, 0, 0, 0, 0, 0); pp(25, 40, -1, 0, 0, 0.6, 50, 35, 0, 1, 0, 1); pp(25, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(25, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(25, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(25, "SWELL STRINGS"); pp(26, 0, 0, 0, 1, 0, 50, 0, 9, 0, 1, 0); pp(26, 10, 50, 0, 0, 50, 1600, 5, 40, 40, 0, 0); pp(26, 20, 1, 250, 0, 200, 0, 1, 350, 0, 250, 5.3); pp(26, 30, 0, 4, 0.4, 0, 10, 0, 0, 0, 0, 0); pp(26, 40, 3, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(26, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(26, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(26, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(26, "PIZZICATO"); pp(27, 0, 0, 0, 1, 0, 50, 0, 9, 0, 1, 0); pp(27, 10, 50, 0, 0, 50, 900, 20, 15, 40, 0, 0); pp(27, 20, 900, 1500, 50, 2500, 0, 900, 1000, 95, 3000, 5.3); pp(27, 30, 0, 4, 0.4, 0, 10, 0, 0, 0, 0, 0); pp(27, 40, -0.5, 0, 0, 0.6, 50, 35, 0, 1, 0, 1); pp(27, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(27, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(27, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(27, "DARK HALL"); pp(28, 0, 0, 0, 1, 0, 50, 0, 14, 0, 1, 0); pp(28, 10, 50, 0, 0, 50, 2000, 25, 30, 40, 0, 0); pp(28, 20, 600, 1500, 70, 1200, 0, 500, 1000, 95, 1400, 5.3); pp(28, 30, 0, 4, 0.4, 0, 10, 0, 0, 0, 0, 0); pp(28, 40, 0.5, 0, 0, 0.6, 50, 35, 0, 1, 0, 1); pp(28, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(28, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(28, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(28, "SYNTH VIOLA"); pp(29, 0, 0, 0, 0, 1, 50, 12, 9, 0, 0, 1); pp(29, 10, 50, 0, 0, 50, 5000, 0, 15, 40, 0, 0); pp(29, 20, 600, 1500, 70, 1200, 0, 500, 1000, 95, 1400, 5.3); pp(29, 30, 0, 4, 6, 0, 15, 0, 0, 0, 0, 0); pp(29, 40, -5, 0, 0, 0.6, 50, 35, 0, 1, 0, 1); pp(29, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(29, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(29, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(29, "STRING MACHINE"); pp(30, 0, 0, 100, 1, 0, 50, 0, 7, 0, 0, 0); pp(30, 10, 50, 1, 0, 15, 2200, 10, 20, 50, 0, 0); pp(30, 20, 80, 400, 60, 250, 0, 90, 300, 90, 250, 5); pp(30, 30, 0, 8, 0.6, 0, 0, 0, 600, 0, 0, 0); pp(30, 40, -1, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(30, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(30, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 320, 25); pp(30, 70, 15, 0, 1, 0, 1, 1, 4, 0, 0, 0); pn(30, "BREATHY FLUTE"); pp(31, 0, 0, 100, 1, 0, 50, 0, 7, 0, 0, 0); pp(31, 10, 50, 1, 0, 25, 1800, 20, 30, 50, 0, 0); pp(31, 20, 40, 300, 40, 300, 0, 40, 400, 80, 400, 5); pp(31, 30, 0, 36, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(31, 40, 0.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(31, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(31, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 320, 25); pp(31, 70, 15, 0, 1, 0, 1, 1, 4, 0, 0, 0); pn(31, "PAN PIPES"); pp(32, 0, 0, 0, 0, 1, 18, 0, 2, 0, 0, 1); pp(32, 10, 25, 0, 0, 50, 1500, 45, 20, 50, 0, 0); pp(32, 20, 40, 300, 70, 150, 0, 40, 300, 90, 150, 5); pp(32, 30, 0, 10, 0.6, 0, 0, 0, 500, 0, 0, 0); pp(32, 40, 1, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(32, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(32, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(32, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(32, "OBOE"); pp(33, 0, 0, 0, 0, 1, 50, 0, 3, 0, 0, 1); pp(33, 10, 50, 0, 0, 50, 1200, 20, 25, 70, 0, 0); pp(33, 20, 30, 300, 70, 150, 0, 30, 300, 90, 150, 5); pp(33, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(33, 40, -3, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(33, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(33, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(33, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(33, "CLARINET"); pp(34, 0, -12, 0, 0, 1, 30, -12, 7, 0, 1, 0); pp(34, 10, 50, 0, 0, 50, 700, 30, 30, 50, 0, 0); pp(34, 20, 40, 300, 60, 150, 0, 40, 300, 90, 150, 5); pp(34, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(34, 40, 0, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(34, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(34, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(34, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(34, "BASSOON"); pp(35, 0, 0, 100, 1, 0, 50, 24, 7, 0, 0, 1); pp(35, 10, 30, 0, 0, 20, 2500, 10, 40, 50, 0, 0); pp(35, 20, 1, 150, 0, 150, 0, 1, 450, 0, 300, 5); pp(35, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(35, 40, -2, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(35, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(35, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(35, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(35, "MARIMBA"); pp(36, 0, 0, 100, 1, 0, 50, 28, 0, 100, 1, 0); pp(36, 10, 50, 0, 0, 25, 3000, 10, 30, 50, 0, 0); pp(36, 20, 1, 200, 0, 200, 0, 1, 700, 0, 400, 5); pp(36, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 1, 0); pp(36, 40, 1, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(36, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(36, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 320, 25); pp(36, 70, 15, 0, 1, 0, 1, 1, 4, 0, 0, 0); pn(36, "KALIMBA"); pp(37, 0, 0, 100, 1, 0, 50, 19, 7, 0, 0, 1); pp(37, 10, 20, 0, 0, 35, 2800, 25, 30, 50, 0, 0); pp(37, 20, 1, 300, 0, 200, 0, 1, 800, 0, 400, 5); pp(37, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(37, 40, 2, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(37, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(37, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(37, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(37, "STEEL DRUM"); pp(38, 0, -12, 100, 1, 0, 50, 0, 7, 0, 0, 0); pp(38, 10, 50, 1, 0, 30, 500, 30, 50, 50, 0, 0); pp(38, 20, 1, 500, 0, 500, 0, 1, 1500, 0, 800, 5); pp(38, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, -0.4, 1); pp(38, 40, 3, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(38, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(38, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(38, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(38, "TIMPANI"); pp(39, 0, 0, 100, 1, 0, 50, 0, 7, 0, 0, 0); pp(39, 10, 50, 1, 0, 25, 900, 40, 60, 100, 0, 0); pp(39, 20, 1, 250, 0, 200, 0, 1, 500, 0, 300, 5); pp(39, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, -1.7, 1); pp(39, 40, 4, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(39, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(39, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(39, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(39, "TOM TOM"); pp(40, 0, 0, 100, 1, 0, 50, 24, 7, 0, 0, 1); pp(40, 10, 50, 0, 0, 50, 2000, 70, 40, 100, 0, 0); pp(40, 20, 1, 60, 0, 50, 0, 1, 120, 0, 80, 5); pp(40, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(40, 40, 6, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(40, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(40, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(40, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(40, "WOODBLOCK"); pp(41, 0, 0, 0, 0, 1, 35, 0, 3, 0, 1, 0); pp(41, 10, 50, 0, 0, 50, 1600, 30, 30, 50, 0, 0); pp(41, 20, 30, 250, 60, 150, 0, 25, 250, 85, 150, 6); pp(41, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(41, 40, 0.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(41, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(41, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(41, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(41, "HARMONICA"); pp(42, 0, 0, 0, 1, 0, 50, 0, 10, 0, 1, 0); pp(42, 10, 50, 0, 0, 50, 900, 10, 60, 50, 0, 0); pp(42, 20, 80, 600, 50, 400, 0, 40, 500, 85, 400, 5); pp(42, 30, 0, 0, 0.6, 0, 0, 30, 0, 0, 0, 0); pp(42, 40, 0, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(42, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(42, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(42, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(42, "RACK BRASS"); pp(43, 0, 0, 0, 1, 0, 50, 0, 7, 0, 1, 0); pp(43, 10, 50, 0, 0, 50, 700, 15, 70, 50, 0, 0); pp(43, 20, 150, 800, 45, 500, 0, 60, 600, 85, 500, 5); pp(43, 30, 0, 0, 0.6, 0, 0, 30, 0, 0, 0, 0); pp(43, 40, -0.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(43, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(43, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(43, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(43, "POLY BRASS"); pp(44, 0, 0, 0, 0, 1, 40, 0, 9, 0, 1, 0); pp(44, 10, 50, 0, 0, 50, 1400, 10, 20, 50, 0, 0); pp(44, 20, 900, 2000, 60, 1800, 0, 800, 1000, 95, 2200, 5); pp(44, 30, 0, 0, 0.3, 0, 15, 0, 0, 0, 0, 0); pp(44, 40, -2.5, 0, 0, 0.5, 50, 35, 0, 1, 0, 1); pp(44, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(44, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(44, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(44, "SOFT PAD"); pp(45, 0, 0, 40, 1, 0, 50, 0, 11, 40, 1, 0); pp(45, 10, 50, 0, 0, 50, 1100, 5, 25, 50, 0, 0); pp(45, 20, 1200, 2500, 70, 2500, 0, 1000, 1000, 100, 2600, 4.5); pp(45, 30, 0, 3, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(45, 40, 0.5, 0, 0, 0.5, 50, 35, 0, 1, 0, 1); pp(45, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(45, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(45, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(45, "WARM PAD"); pp(46, 0, 0, 0, 1, 0, 50, 12, 7, 0, 1, 0); pp(46, 10, 50, 0, 1, 50, 3000, 10, 10, 50, 0, 0); pp(46, 20, 2, 400, 40, 300, 0, 1500, 1000, 100, 3000, 5); pp(46, 30, 0, 0, 0.6, 0, 10, 0, 0, 2, 4.8, 0); pp(46, 40, -0.5, 0, 0, 0.5, 50, 35, 0, 1, 0, 1); pp(46, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(46, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 450, 45); pp(46, 70, 20, 0, 1, 0, 1, 2, 4, 0, 0, 0); pn(46, "GLASS PAD"); pp(47, 0, 0, 0, 1, 0, 50, 0, 8, 0, 1, 0); pp(47, 10, 50, 0, 0, 50, 400, 55, 68.3333, 50, 0, 0); pp(47, 20, 2, 400, 40, 300, 0, 1000, 1000, 100, 3000, 5); pp(47, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(47, 40, 1, 0, 0, 0.5, 50, 35, 0, 1, 0, 1); pp(47, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(47, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(47, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(47, "SWEEP PAD"); pp(48, 0, 0, 0, 0, 1, 50, 0, 6, 0, 0, 1); pp(48, 10, 50, 0, 0, 50, 1800, 10, 15, 50, 0, 0); pp(48, 20, 2, 400, 40, 300, 0, 700, 1000, 100, 2000, 5); pp(48, 30, 0, 0, 0.5, 0, 40, 0, 0, 0, 0, 0); pp(48, 40, -4, 0, 0, 0.5, 50, 35, 0, 1, 0, 1); pp(48, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(48, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(48, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(48, "PWM PAD"); pp(49, 0, 0, 0, 1, 0, 50, 7, 4, 0, 1, 0); pp(49, 10, 50, 0, 0, 50, 1600, 10, 20, 50, 0, 0); pp(49, 20, 2, 400, 40, 300, 0, 800, 1000, 100, 2000, 5); pp(49, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(49, 40, -0.5, 0, 0, 0.5, 50, 35, 0, 1, 0, 1); pp(49, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(49, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(49, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(49, "FIFTHS PAD"); pp(50, 0, 0, 0, 1, 0, 50, 12, 7, 0, 1, 0); pp(50, 10, 50, 0, 1, 50, 4000, 10, 0, 50, 0, 0); pp(50, 20, 10, 1500, 20, 800, 0, 5, 800, 80, 600, 5); pp(50, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 10.8, 0); pp(50, 40, -1, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(50, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(50, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(50, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(50, "SYNC SWEEP"); pp(51, 0, 0, 0, 1, 0, 50, 0, 6, 0, 1, 0); pp(51, 10, 50, 0, 0, 50, 600, 30, 70, 50, 0, 0); pp(51, 20, 1, 250, 10, 200, 0, 1, 600, 30, 300, 5); pp(51, 30, 0, 0, 0.6, 0, 0, 30, 0, 0, 0, 0); pp(51, 40, 2, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(51, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(51, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 300, 35); pp(51, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(51, "PLUCK POLY"); pp(52, 0, 0, 0, 1, 0, 50, 0, 15, 0, 1, 0); pp(52, 10, 50, 0, 0, 50, 900, 40, 60, 50, 0, 0); pp(52, 20, 1, 180, 20, 120, 0, 1, 250, 60, 100, 5); pp(52, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(52, 40, 5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(52, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(52, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 300, 35); pp(52, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(52, "STAB SYNTH"); pp(53, 0, 0, 0, 1, 1, 50, -12, 25, 0, 1, 0); pp(53, 10, 50, 0, 0, 50, 3000, 10, 10, 50, 0, 0); pp(53, 20, 2, 400, 40, 300, 0, 30, 500, 90, 600, 5); pp(53, 30, 0, 0, 0.6, 0, 25, 0, 0, 0, -2.7, 1); pp(53, 40, -6, 2, 60, 0.8, 50, 0, 0, 1, 0, 1); pp(53, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(53, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(53, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(53, "HOOVER-ISH"); pp(54, 0, 0, 0, 0, 1, 30, 0, 6, 0, 1, 0); pp(54, 10, 50, 0, 0, 50, 1000, 55, 10, 60, 0, 0); pp(54, 20, 2, 400, 40, 300, 0, 600, 1000, 100, 1800, 5); pp(54, 30, 0, 5, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(54, 40, -1, 0, 0, 0.5, 50, 35, 0, 1, 0, 1); pp(54, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(54, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(54, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(54, "CHOIR PAD"); pp(55, 0, 0, 0, 1, 0, 50, 0, 5, 0, 1, 0); pp(55, 10, 50, 0, 0, 50, 800, 70, 20, 50, 0, 0); pp(55, 20, 300, 800, 40, 800, 0, 250, 800, 90, 900, 5); pp(55, 30, 0, 0, 0.6, 0, 20, 0, 0, 1, 0, 0); pp(55, 40, 2, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(55, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(55, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(55, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(55, "VOX SYNTH"); pp(56, 0, 0, 0, 1, 1, 50, 0, 14, 0, 1, 1); pp(56, 10, 50, 0, 0, 50, 1500, 20, 35, 50, 0, 0); pp(56, 20, 5, 700, 40, 400, 0, 5, 500, 85, 400, 5); pp(56, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(56, 40, -7.5, 0, 0, 0.5, 50, 35, 0, 1, 0, 1); pp(56, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(56, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(56, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(56, "FAT POLY"); pp(57, 0, 0, 0, 1, 0, 50, 0, 9, 0, 1, 0); pp(57, 10, 50, 0, 0, 50, 300, 40, 60, 50, 0, 0); pp(57, 20, 3000, 3000, 80, 2000, 0, 1500, 1000, 100, 2000, 5); pp(57, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(57, 40, 1.5, 0, 0, 0.5, 50, 35, 0, 1, 0, 1); pp(57, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(57, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(57, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(57, "SLOW RISE"); pp(58, 0, 0, 0, 1, 0, 50, 7, 10, 0, 1, 0); pp(58, 10, 50, 0, 0, 50, 1200, 30, 20, 50, 0, 0); pp(58, 20, 2, 400, 40, 300, 0, 1500, 1000, 100, 4000, 5); pp(58, 30, 0, 0, 0.6, 0, 30, 0, 0, 1, 0, 0); pp(58, 40, 1, 0, 0, 0.5, 50, 35, 0, 1, 0, 1); pp(58, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(58, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 450, 45); pp(58, 70, 20, 0, 1, 0, 1, 2, 4, 0, 0, 0); pn(58, "SPACE PAD"); pp(59, 0, 0, 0, 1, 0, 50, 0, 8, 0, 1, 0); pp(59, 10, 50, 0, 0, 50, 600, 15, 55, 50, 0, 0); pp(59, 20, 900, 600, 70, 600, 0, 600, 600, 90, 600, 5); pp(59, 30, 0, 0, 0.6, 0, 0, 30, 0, 0, 0, 0); pp(59, 40, 0, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(59, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(59, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(59, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(59, "BRASS SWELL"); pp(60, 0, 0, 0, 0, 1, 30, 0, 4, 0, 1, 0); pp(60, 10, 50, 0, 0, 50, 500, 45, 75, 50, 0, 0); pp(60, 20, 1, 160, 0, 150, 0, 1, 300, 0, 200, 5); pp(60, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(60, 40, 3.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(60, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(60, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 300, 35); pp(60, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(60, "ARP PLUCK"); pp(61, 0, 0, 100, 1, 0, 50, 12, 0, 100, 1, 0); pp(61, 10, 50, 0, 1, 50, 5000, 10, 0, 50, 0, 0); pp(61, 20, 2, 400, 40, 300, 0, 10, 800, 80, 800, 5); pp(61, 30, 0, 100, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(61, 40, 0.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(61, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(61, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 300, 35); pp(61, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(61, "DIGI WAVE"); pp(62, 0, -12, 0, 1, 0, 50, -12, 4, 0, 1, 0); pp(62, 10, 50, 0, 0, 50, 500, 25, 55, 40, 0, 0); pp(62, 20, 1, 300, 20, 120, 0, 1, 500, 80, 100, 5); pp(62, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(62, 40, 0, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(62, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(62, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(62, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(62, "RACK BASS"); pp(63, 0, -12, 0, 1, 0, 50, -12, 10, 0, 1, 0); pp(63, 10, 50, 0, 0, 50, 700, 15, 55, 40, 0, 0); pp(63, 20, 1, 300, 20, 120, 0, 1, 500, 80, 100, 5); pp(63, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(63, 40, 1.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(63, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(63, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(63, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(63, "FAT SAW BASS"); pp(64, 0, -12, 0, 0, 1, 30, -12, 4, 0, 0, 1); pp(64, 10, 45, 0, 0, 50, 600, 25, 55, 40, 0, 0); pp(64, 20, 1, 300, 20, 120, 0, 1, 500, 80, 100, 5); pp(64, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(64, 40, 0, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(64, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(64, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(64, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(64, "PULSE BASS"); pp(65, 0, -12, 100, 1, 0, 50, -24, 4, 100, 1, 0); pp(65, 10, 50, 0, 0, 50, 300, 0, 10, 40, 0, 0); pp(65, 20, 2, 400, 40, 300, 0, 2, 800, 90, 150, 5); pp(65, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(65, 40, -0.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(65, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(65, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(65, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(65, "SUB BASS"); pp(66, 0, -12, 0, 1, 0, 50, -12, 4, 0, 1, 0); pp(66, 10, 50, 0, 0, 50, 300, 65, 75, 40, 0, 0); pp(66, 20, 1, 200, 0, 100, 0, 1, 400, 70, 100, 5); pp(66, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(66, 40, 2.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(66, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(66, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(66, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(66, "RESO BASS"); pp(67, 0, -12, 0, 0, 1, 20, -12, 4, 0, 1, 0); pp(67, 10, 50, 0, 0, 50, 900, 20, 50, 40, 0, 0); pp(67, 20, 1, 150, 10, 100, 0, 1, 1200, 0, 150, 5); pp(67, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(67, 40, 2, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(67, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(67, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(67, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(67, "PICK BASS"); pp(68, 0, -12, 0, 1, 0, 50, 0, 4, 0, 1, 0); pp(68, 10, 50, 0, 1, 50, 1500, 25, 20, 40, 0, 0); pp(68, 20, 2, 400, 40, 300, 0, 1, 500, 80, 100, 5); pp(68, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 6, 0); pp(68, 40, 1, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(68, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(68, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(68, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(68, "SYNC BASS"); pp(69, 0, -12, 0, 1, 0, 50, -12, 4, 0, 1, 0); pp(69, 10, 50, 0, 0, 50, 200, 50, 80, 40, 0, 0); pp(69, 20, 80, 400, 30, 200, 0, 5, 500, 85, 100, 5); pp(69, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(69, 40, 2, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(69, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(69, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(69, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(69, "WOW BASS"); pp(70, 0, -12, 60, 1, 0, 50, -12, 4, 60, 1, 0); pp(70, 10, 50, 0, 0, 50, 700, 15, 30, 40, 0, 0); pp(70, 20, 40, 600, 40, 300, 0, 30, 800, 70, 300, 5); pp(70, 30, 0, 6, 0.6, 0, 0, 0, 700, 0, 0, 0); pp(70, 40, 2.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(70, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(70, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(70, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(70, "FRETLESS"); pp(71, 0, -12, 0, 0, 1, 50, -24, 4, 0, 0, 1); pp(71, 10, 50, 0, 0, 50, 400, 40, 60, 40, 0, 0); pp(71, 20, 1, 180, 0, 80, 0, 1, 300, 60, 80, 5); pp(71, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(71, 40, 2, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(71, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(71, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(71, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(71, "HOUSE BASS"); pp(72, 0, -12, 0, 1, 0, 50, -12, 0, 0, 0, 0); pp(72, 10, 50, 0, 0, 0, 250, 80, 85, 40, 0, 0); pp(72, 20, 1, 180, 0, 80, 0, 1, 300, 80, 60, 5); pp(72, 30, 0, 0, 0.6, 0, 0, 50, 0, 0, 0, 0); pp(72, 40, -6.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(72, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(72, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(72, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(72, "ACID-ISH"); pp(73, 0, -12, 100, 1, 0, 50, -12, 4, 70, 1, 0); pp(73, 10, 50, 0, 0, 50, 450, 10, 20, 40, 0, 0); pp(73, 20, 1, 300, 20, 120, 0, 1, 500, 80, 100, 5); pp(73, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(73, 40, 0.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(73, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(73, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(73, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(73, "SOFT ROUND"); pp(74, 0, -12, 0, 0, 1, 15, -12, 4, 0, 1, 0); pp(74, 10, 50, 0, 0, 50, 1200, 30, 55, 40, 0, 0); pp(74, 20, 1, 90, 10, 80, 0, 1, 400, 40, 80, 5); pp(74, 30, 0, 0, 0.6, 0, 0, 50, 0, 0, 0, 0); pp(74, 40, 2.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(74, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(74, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(74, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(74, "SLAP SYNTH"); pp(75, 0, -12, 0, 1, 0, 50, -12, 15, 0, 1, 0); pp(75, 10, 50, 0, 0, 50, 350, 35, 10, 40, 0, 0); pp(75, 20, 2, 400, 40, 300, 0, 200, 1000, 100, 1200, 5); pp(75, 30, 0, 0, 0.15, 0, 15, 0, 0, 1, 0, 0); pp(75, 40, 0, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(75, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(75, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(75, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(75, "DEEP DRONE"); pp(76, 0, 0, 0, 1, 0, 50, 0, 8, 0, 1, 0); pp(76, 10, 50, 0, 0, 50, 2500, 25, 35, 50, 0, 0); pp(76, 20, 5, 400, 50, 250, 0, 3, 300, 90, 250, 5.5); pp(76, 30, 0, 10, 0.6, 0, 0, 0, 600, 0, 0, 0); pp(76, 40, 4, 1, 40, 0.8, 50, 0, 0, 1, 0, 1); pp(76, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(76, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(76, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(76, "RACK LEAD"); pp(77, 0, 0, 0, 1, 0, 50, 12, 8, 0, 1, 0); pp(77, 10, 50, 0, 1, 50, 2500, 25, 35, 50, 0, 0); pp(77, 20, 2, 400, 40, 300, 0, 3, 300, 90, 250, 5.5); pp(77, 30, 0, 10, 0.6, 0, 0, 0, 600, 0, 7.2, 0); pp(77, 40, 5.5, 1, 40, 0.8, 50, 0, 0, 1, 0, 1); pp(77, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(77, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(77, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(77, "SYNC LEAD"); pp(78, 0, 0, 0, 0, 1, 50, 12, 4, 0, 0, 1); pp(78, 10, 50, 0, 0, 50, 3500, 25, 35, 50, 0, 0); pp(78, 20, 5, 400, 50, 250, 0, 3, 300, 90, 250, 5.5); pp(78, 30, 0, 10, 0.6, 0, 0, 0, 600, 0, 0, 0); pp(78, 40, 3.5, 1, 40, 0.8, 50, 0, 0, 1, 0, 1); pp(78, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(78, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(78, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(78, "SQUARE LEAD"); pp(79, 0, 0, 0, 1, 0, 50, 0, 12, 0, 1, 0); pp(79, 10, 50, 0, 0, 50, 3000, 15, 35, 50, 0, 0); pp(79, 20, 5, 400, 50, 250, 0, 3, 300, 90, 250, 5.5); pp(79, 30, 0, 10, 0.6, 0, 0, 0, 600, 0, 0, 0); pp(79, 40, 3, 1, 40, 0.6, 45, 25, 0, 1, 0, 1); pp(79, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(79, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(79, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(79, "SOLO SAW"); pp(80, 0, 12, 100, 1, 0, 50, 0, 8, 0, 0, 0); pp(80, 10, 50, 1, 0, 10, 3000, 10, 0, 50, 0, 0); pp(80, 20, 5, 400, 50, 250, 0, 3, 300, 90, 250, 5.5); pp(80, 30, 0, 10, 0.6, 0, 0, 0, 600, 0, 0, 0); pp(80, 40, 2.5, 1, 40, 0.8, 50, 0, 0, 1, 0, 1); pp(80, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(80, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 320, 25); pp(80, 70, 15, 0, 1, 0, 1, 1, 4, 0, 0, 0); pn(80, "WHISTLE"); pp(81, 0, 0, 0, 1, 0, 50, 0, 8, 0, 1, 0); pp(81, 10, 50, 0, 0, 50, 900, 20, 60, 50, 0, 0); pp(81, 20, 60, 500, 40, 300, 0, 20, 300, 90, 250, 5.5); pp(81, 30, 0, 10, 0.6, 0, 0, 0, 600, 0, 0, 0); pp(81, 40, 3.5, 1, 40, 0.8, 50, 0, 0, 1, 0, 1); pp(81, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(81, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(81, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(81, "BRASSY LEAD"); pp(82, 0, 0, 0, 0, 1, 10, 0, 8, 0, 0, 1); pp(82, 10, 15, 0, 0, 50, 1800, 50, 35, 50, 0, 0); pp(82, 20, 5, 400, 50, 250, 0, 3, 300, 90, 250, 5.5); pp(82, 30, 0, 10, 0.6, 0, 0, 0, 600, 0, 0, 0); pp(82, 40, 6, 1, 40, 0.8, 50, 0, 0, 1, 0, 1); pp(82, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(82, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(82, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(82, "NASAL LEAD"); pp(83, 0, 0, 0, 1, 0, 50, 7, 3, 0, 1, 0); pp(83, 10, 50, 0, 0, 50, 2500, 25, 35, 50, 0, 0); pp(83, 20, 5, 400, 50, 250, 0, 3, 300, 90, 250, 5.5); pp(83, 30, 0, 10, 0.6, 0, 0, 0, 600, 0, 0, 0); pp(83, 40, 6, 1, 40, 0.8, 50, 0, 0, 1, 0, 1); pp(83, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(83, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(83, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(83, "FIFTH LEAD"); pp(84, 0, 0, 100, 1, 0, 50, 12, 2, 100, 1, 0); pp(84, 10, 50, 0, 0, 25, 4000, 0, 0, 50, 0, 0); pp(84, 20, 5, 400, 50, 250, 0, 3, 300, 90, 250, 5.5); pp(84, 30, 0, 10, 0.6, 0, 0, 0, 600, 0, 0, 0); pp(84, 40, 2, 1, 40, 0.8, 50, 0, 0, 1, 0, 1); pp(84, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(84, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(84, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(84, "SINE LEAD"); pp(85, 0, 0, 0, 1, 0, 50, 0, 8, 0, 1, 0); pp(85, 10, 50, 0, 0, 50, 1500, 75, 40, 50, 0, 0); pp(85, 20, 5, 400, 50, 250, 0, 3, 300, 90, 250, 5.5); pp(85, 30, 0, 10, 0.6, 0, 0, 0, 600, 0, 0, 0); pp(85, 40, 6, 1, 40, 0.8, 50, 0, 0, 1, 0, 1); pp(85, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(85, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(85, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(85, "SCREAMER"); pp(86, 0, 0, 0, 1, 0, 50, 0, 8, 0, 1, 0); pp(86, 10, 50, 0, 0, 50, 2200, 30, 35, 50, 0, 0); pp(86, 20, 5, 400, 50, 250, 0, 3, 300, 90, 250, 5.5); pp(86, 30, 0, 10, 0.6, 0, 0, 0, 600, 0, 0, 0); pp(86, 40, 4.5, 1, 160, 0.8, 50, 0, 0, 1, 0, 1); pp(86, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(86, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(86, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(86, "PORTA LEAD"); pp(87, 0, 0, 0, 1, 0, 50, 0, 8, 0, 1, 0); pp(87, 10, 50, 0, 0, 50, 600, 60, 10, 50, 0, 0); pp(87, 20, 5, 400, 50, 250, 0, 3, 300, 90, 250, 5.5); pp(87, 30, 0, 10, 3, 0, 40, 0, 600, 1, 0, 0); pp(87, 40, 4, 1, 40, 0.8, 50, 0, 0, 1, 0, 1); pp(87, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(87, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(87, 70, 22, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(87, "WAH LEAD"); pp(88, 0, 0, 0, 0, 0, 50, 0, 7, 0, 0, 0); pp(88, 10, 50, 1, 0, 100, 700, 60, 0, 50, 0, 0); pp(88, 20, 2, 400, 40, 300, 0, 1500, 1000, 100, 3000, 5); pp(88, 30, 0, 0, 0.2, 0, 60, 0, 0, 1, 0, 0); pp(88, 40, 6, 0, 0, 0.3, 70, 40, 40, 1, 0, 1); pp(88, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(88, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(88, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(88, "WIND"); pp(89, 0, 0, 0, 0, 0, 50, 0, 7, 0, 0, 0); pp(89, 10, 50, 1, 0, 100, 1500, 20, 0, 50, 0, 0); pp(89, 20, 2, 400, 40, 300, 0, 2000, 1000, 100, 4000, 5); pp(89, 30, 0, 0, 0.12, 0, 50, 0, 0, 1, 0, 0); pp(89, 40, 6, 0, 0, 0.3, 70, 40, 40, 1, 0, 1); pp(89, 50, 0, 2, 0.12, 60, 0, 1, 0, 1, 0, 5); pp(89, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(89, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(89, "SURF"); pp(90, 0, 0, 0, 1, 1, 50, 0, 7, 0, 1, 0); pp(90, 10, 50, 0, 0, 50, 1200, 70, 0, 50, 0, 0); pp(90, 20, 2, 400, 40, 300, 0, 2, 500, 100, 600, 5); pp(90, 30, 0, 0, 8, 4, 60, 0, 0, 1, 0, 0); pp(90, 40, -6, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(90, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(90, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 300, 50); pp(90, 70, 28, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(90, "S&H COMPUTER"); pp(91, 0, 0, 0, 1, 0, 50, 24, 7, 0, 1, 0); pp(91, 10, 50, 0, 1, 50, 6000, 0, 0, 50, 0, 0); pp(91, 20, 1, 400, 0, 300, 0, 1, 600, 0, 300, 5); pp(91, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 15.6, 1); pp(91, 40, 1.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(91, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(91, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 300, 50); pp(91, 70, 28, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(91, "LASER"); pp(92, 0, 0, 100, 1, 0, 50, 0, 7, 0, 0, 0); pp(92, 10, 50, 0, 0, 0, 5000, 0, 0, 50, 0, 0); pp(92, 20, 2, 400, 40, 300, 0, 50, 1000, 100, 800, 5); pp(92, 30, 0, 0, 0.5, 0, 60, 0, 0, 2, 0, 0); pp(92, 40, -5.5, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(92, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(92, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 500, 40); pp(92, 70, 25, 30, 1, 0, 1, 0, 4, 0, 0, 0); pn(92, "SIREN"); pp(93, 0, 0, 0, 1, 0, 50, 0, 7, 0, 1, 0); pp(93, 10, 50, 0, 0, 50, 3000, 40, 73.3333, 50, 0, 0); pp(93, 20, 2, 400, 40, 300, 0, 1, 500, 0, 300, 5); pp(93, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 12, 1); pp(93, 40, 4, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(93, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(93, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 300, 50); pp(93, 70, 28, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(93, "ZAP DROP"); pp(94, 0, 0, 100, 1, 0, 50, 0, 7, 0, 0, 0); pp(94, 10, 50, 0, 0, 0, 2500, 50, 0, 50, 0, 0); pp(94, 20, 2, 400, 40, 300, 0, 10, 1000, 100, 600, 5); pp(94, 30, 0, 0, 9, 4, 30, 0, 0, 2, 0, 0); pp(94, 40, -1, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(94, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(94, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 300, 50); pp(94, 70, 28, 0, 1, 0, 1, 2, 5, 0, 0, 0); pn(94, "BUBBLES"); pp(95, 0, 0, 0, 1, 0, 50, 17, 0, 0, 1, 0); pp(95, 10, 50, 0, 1, 50, 3500, 30, 30, 50, 60, 0); pp(95, 20, 1, 600, 0, 500, 0, 1, 1500, 0, 800, 5); pp(95, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(95, 40, 3, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(95, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(95, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(95, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(95, "METAL CLANG"); pp(96, 0, 0, 0, 1, 0, 50, 0, 20, 0, 1, 0); pp(96, 10, 50, 0, 0, 50, 300, 40, 83.3333, 50, 0, 0); pp(96, 20, 6000, 1000, 100, 1000, 0, 4000, 1000, 100, 1000, 5); pp(96, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 1.4, 1); pp(96, 40, 6, 0, 0, 0.3, 70, 40, 40, 1, 0, 1); pp(96, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(96, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(96, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(96, "RISER"); pp(97, 0, 0, 0, 1, 0, 50, 1, 0, 0, 1, 0); pp(97, 10, 50, 0, 0, 50, 900, 50, 40, 50, 0, 0); pp(97, 20, 2, 400, 40, 300, 0, 2000, 1000, 100, 3000, 5); pp(97, 30, 0, 0, 0.1, 0, 40, 0, 0, 1, 0, 0); pp(97, 40, 3, 0, 0, 0.3, 70, 40, 40, 1, 0, 1); pp(97, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(97, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(97, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(97, "DRONE CLUSTER"); pp(98, 0, 0, 0, 0, 0, 50, 0, 7, 0, 0, 0); pp(98, 10, 50, 1, 0, 100, 400, 40, 0, 50, 0, 0); pp(98, 20, 2, 400, 40, 300, 0, 500, 1000, 100, 1500, 5); pp(98, 30, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0); pp(98, 40, 6, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(98, 50, 0, 2, 12, 100, 100, 1, 0, 1, 0, 5); pp(98, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(98, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(98, "HELICOPTER"); pp(99, 0, 0, 100, 1, 0, 50, 31, 7, 100, 1, 0); pp(99, 10, 50, 0, 0, 50, 2500, 20, 20, 50, 70, 0); pp(99, 20, 2, 400, 40, 300, 0, 1, 3000, 0, 1500, 5); pp(99, 30, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, 0); pp(99, 40, 1, 0, 0, 0.8, 50, 0, 0, 1, 0, 1); pp(99, 50, 0, 2, 4, 0, 0, 1, 0, 1, 0, 5); pp(99, 60, 1.5, 0, 0, 1, 0, 1, 0, 4, 350, 30); pp(99, 70, 0, 0, 1, 0, 1, 0, 4, 0, 0, 0); pn(99, "FM BELLTREE"); // ---------- envelopes: DADSR (linear attack from where it stands, exponential decay / release) ---------- function eg_gate(on, retrig) instance(st, dt) ( on ? ( retrig || st == 0 || st == 4 ? ( st = 1; dt = 0; ); ) : ( st > 0 ? st = 4; ); ); function eg(d, ai, dc, s, rc) instance(st, lv, dt) ( st == 1 ? ( dt += 1; dt >= d ? st = 2; ) : st == 2 ? ( lv += ai; lv >= 1 ? ( lv = 1; st = 3; ); ) : st == 3 ? ( lv += (s - lv)*dc; ) : st == 4 ? ( lv += (0 - lv)*rc; lv < 0.00002 ? ( lv = 0; st = 0; ); ); lv; ); // ---------- LFOs (shared by the voices) ---------- function lfo(rate, w) instance(ph, sh, nz, tg) local(y, wr) ( ph += rate/srate; wr = ph >= 1; ph -= floor(ph); wr ? sh = rand(2) - 1; w == 0 ? y = 1 - 4*abs(ph - 0.5) : w == 1 ? y = 2*ph - 1 : w == 2 ? y = 1 - 2*ph : w == 3 ? y = ph < 0.5 ? 1 : -1 : w == 4 ? y = sh : ( (rand(1) < rate*12/srate) ? tg = rand(2) - 1; nz += (tg - nz)*min(1, rate*40/srate); y = nz; ); y; ); // ---------- one voice ---------- function vinit(p, u) instance(pan, uo, cur, tgt, nd, drA, drB, drP) ( pan = p; uo = u; cur = 60; tgt = 60; nd = 1; drA.drift_init(0.8 + rand(0.5)); drB.drift_init(0.8 + rand(0.5)); drP.drift_init(0.8 + rand(0.5)); ); // once a block: this voice's own drift (fine pitch of each DCO, pulse width) function vblock(inc) instance(df1, df2, dpw, drA, drB, drP) ( df1 = drA.drift_tick(inc)*drift*8; // cents df2 = drB.drift_tick(inc)*drift*8; dpw = drP.drift_tick(inc)*drift*0.08; ); function vstart(n, v, retrig) instance(cur, tgt, vel, vg, nd, r1, cnt, played, e1, e2) ( tgt = n; vel = v/127; vg = 1 - VELS + VELS*vel; glide_k >= 1 || !played ? cur = n; retrig ? ( nd = ins_note_detune(); r1 = 0; ); e1.eg_gate(1, retrig); e2.eg_gate(1, retrig); cnt = 0; played = 1; ); function vstop() instance(e1, e2) ( e1.eg_gate(0, 0); e2.eg_gate(0, 0); ); function vglide(n) instance(tgt) ( tgt = n; ); function vrun() instance(e1, e2, flt, cur, tgt, vel, vg, nd, ph1, ph2, r1, cnt, inc1, inc2, pw1, pw2, sh1, sh2, fc, rs, df1, df2, dpw, uo, e1v) local(e2v, pe, p1, p2l, lp, vibc, base, oct, wrap, t, p2, o1, o2, y, f) ( e2.st == 0 ? 0 : ( e1v = e1.eg(E1D, E1A, E1DC, E1S, E1R); e2v = e2.eg(E2D, E2A, E2DC, E2S, E2R); r1 = min(1, r1 + L1DI); // control rate, every 16 samples (cnt -= 1) <= 0 ? ( cnt = 16; cur += (tgt - cur)*glide_k; pe = PENV*e1v; // ENV 1 -> pitch (DCO 2, or both) lp = L2D == 2 ? lfo2v*L2AMT*12 : 0; // LFO 2 -> pitch p1 = (PTGT ? pe : 0) + lp; p2l = pe + lp; vibc = lfo1v*(L1AMT*r1 + max(modw, atch)*50); // LFO 1 vibrato (fades in), wheel / aftertouch add more base = cur - 69 + bend_st; inc1 = min(440*2^((base + D1F + p1 + (vibc + df1 + uo*UNI)/100)/12)*ins_pitch*nd/srate, 0.45); inc2 = min(440*2^((base + D2F + p2l + (vibc + df2 + D2DET + uo*UNI*0.7)/100 + ins_aux)/12)*ins_pitch*nd/srate, 0.45); pw1 = min(max(D1PW + (L2D == 0 ? lfo2v*L2AMT*0.45 : 0) + dpw, 0.05), 0.95); pw2 = min(max(D2PW + (L2D == 0 ? lfo2v*L2AMT*0.45 : 0) - dpw, 0.05), 0.95); sh1 = D1SH; sh2 = D2SH; oct = VENV*e1v*6 + VKEY*(cur - 60)/12 + VVEL*vel*5 + (L2D == 1 ? lfo2v*L2AMT*5 : 0) + ins_cut; fc = min(max(CUT*2^oct, 20), srate*0.45); rs = RES*0.95; ); // DCO 1 ph1 += inc1; wrap = ph1 >= 1; ph1 -= floor(ph1); o1 = 0; D1W ? ( o1 = 2*ph1 - 1 - vo_blep(ph1, inc1); t = ph1 < 0.5 ? 4*ph1 - 1 : 3 - 4*ph1; o1 += (t - o1)*sh1; ); D1P ? ( p2 = ph1 + 1 - pw1; p2 -= floor(p2); o1 += 0.8*((2*ph1 - 1 - vo_blep(ph1, inc1)) - (2*p2 - 1 - vo_blep(p2, inc1))); ); // DCO 2 (hard sync to DCO 1) SYNC && wrap ? ph2 = ph1*inc2/inc1 : ( ph2 += inc2; ph2 -= floor(ph2); ); D2N ? o2 = rand(2) - 1 : ( o2 = 0; D2W ? ( o2 = 2*ph2 - 1 - vo_blep(ph2, inc2); t = ph2 < 0.5 ? 4*ph2 - 1 : 3 - 4*ph2; o2 += (t - o2)*sh2; ); D2P ? ( p2 = ph2 + 1 - pw2; p2 -= floor(p2); o2 += 0.8*((2*ph2 - 1 - vo_blep(ph2, inc2)) - (2*p2 - 1 - vo_blep(p2, inc2))); ); ); y = o1*(1 - MIX) + o2*MIX; // VCF (24 dB), with DCO 1 sweeping the cutoff when FM is up f = VFM > 0 ? min(max(fc*2^(VFM*o1*2), 20), srate*0.45) : fc; y = flt.vo_ladder(y*0.45, f, rs, 0); y*e2v*vg; ); ); // dispatch to a voice by number function v_start(i, n, v, r) ( i == 0 ? v0.vstart(n, v, r) : i == 1 ? v1.vstart(n, v, r) : i == 2 ? v2.vstart(n, v, r) : i == 3 ? v3.vstart(n, v, r) : i == 4 ? v4.vstart(n, v, r) : v5.vstart(n, v, r); ); function v_stop(i) ( i == 0 ? v0.vstop() : i == 1 ? v1.vstop() : i == 2 ? v2.vstop() : i == 3 ? v3.vstop() : i == 4 ? v4.vstop() : v5.vstop(); ); function v_glide(i, n) ( i == 0 ? v0.vglide(n) : i == 1 ? v1.vglide(n) : i == 2 ? v2.vglide(n) : i == 3 ? v3.vglide(n) : i == 4 ? v4.vglide(n) : v5.vglide(n); ); function v_idle(i) ( i == 0 ? v0.e2.st == 0 : i == 1 ? v1.e2.st == 0 : i == 2 ? v2.e2.st == 0 : i == 3 ? v3.e2.st == 0 : i == 4 ? v4.e2.st == 0 : v5.e2.st == 0; ); // ---------- notes ---------- function all_off() local(i) ( i = 0; loop(NV, VG[i] ? v_stop(i); VG[i] = 0; VS[i] = 0; VN[i] = -1; i += 1; ); hcount = 0; ); function poly_on(n, v) local(i, best, ba) ( best = -1; i = 0; loop(NV, VN[i] == n ? best = i; i += 1; ); best < 0 ? ( ba = -1; i = 0; loop(NV, v_idle(i) && (best < 0 || VT[i] < ba) ? ( best = i; ba = VT[i]; ); i += 1; ); ); best < 0 ? ( ba = -1; i = 0; loop(NV, !VG[i] && (best < 0 || VT[i] < ba) ? ( best = i; ba = VT[i]; ); i += 1; ); ); best < 0 ? ( ba = -1; i = 0; loop(NV, best < 0 || VT[i] < ba ? ( best = i; ba = VT[i]; ); i += 1; ); ); vage += 1; VT[best] = vage; VN[best] = n; VG[best] = 1; VS[best] = 0; v_start(best, n, v, 1); ); function poly_off(n) local(i) ( i = 0; loop(NV, VN[i] == n && VG[i] ? ( pedal ? VS[i] = 1 : ( v_stop(i); VG[i] = 0; ); ); i += 1; ); ); // MONO plays voice 1; UNISON plays all six on the same note function m_start(n, v, r) local(i) ( vmode == 2 ? ( i = 0; loop(NV, v_start(i, n, v, r); VG[i] = 1; VN[i] = n; i += 1; ); ) : ( v_start(0, n, v, r); VG[0] = 1; VN[0] = n; ); ); function m_glide(n) local(i) ( vmode == 2 ? ( i = 0; loop(NV, v_glide(i, n); i += 1; ); ) : v_glide(0, n); ); function m_stop() local(i) ( vmode == 2 ? ( i = 0; loop(NV, v_stop(i); VG[i] = 0; i += 1; ); ) : ( v_stop(0); VG[0] = 0; ); ); function mono_on(n, v) local(i, f, legato) ( legato = hcount > 0; f = -1; i = 0; loop(hcount, HN[i] == n ? f = i; i += 1; ); f >= 0 ? ( i = f; loop(hcount - f - 1, HN[i] = HN[i + 1]; i += 1; ); hcount -= 1; ); hcount < 127 ? ( HN[hcount] = n; hcount += 1; ); legato ? ( m_glide(n); m_start(n, v, 0); ) : m_start(n, v, 1); ); function mono_off(n) local(i, f) ( f = -1; i = 0; loop(hcount, HN[i] == n ? f = i; i += 1; ); f >= 0 ? ( i = f; loop(hcount - f - 1, HN[i] = HN[i + 1]; i += 1; ); hcount -= 1; hcount > 0 ? m_glide(HN[hcount - 1]) : ( pedal ? msus = 1 : m_stop(); ); ); ); function note_on(n, v) ( vmode ? mono_on(n, v) : poly_on(n, v); ); function note_off(n) ( vmode ? mono_off(n) : poly_off(n); ); function pedal_up() local(i) ( i = 0; loop(NV, VS[i] ? ( v_stop(i); VG[i] = 0; VS[i] = 0; ); i += 1; ); msus && hcount == 0 ? m_stop(); msus = 0; ); function q_push(ofs, t, n, v) local(i) ( qcount < 300 ? ( i = qcount; while (i > 0 && EQO[i - 1] > ofs) ( EQO[i] = EQO[i - 1]; EQT[i] = EQT[i - 1]; EQN[i] = EQN[i - 1]; EQV[i] = EQV[i - 1]; i -= 1; ); EQO[i] = ofs; EQT[i] = t; EQN[i] = n; EQV[i] = v; qcount += 1; ); ); // ---------- parameters ---------- function ms_(ms) ( 1 - exp(-4.6/(max(ms, 0.5)*0.001*srate)); ); // ---------- MOD RACK (the GFX Mod Rack inside): chorus, tremolo, vibe, delay in parallel on the voices ---------- // each module adds only its change ("delta") to the dry signal; L / C / R pick left, mono centre, right mrCHN = 16384; mrDLN = floor(srate*2.2) + 8; mrChA = MR; mrChB = MR + mrCHN; mrChC = MR + 2*mrCHN; mrDlA = MR + 3*mrCHN; mrDlB = mrDlA + mrDLN; mrDlC = mrDlB + mrDLN; mrVsC = mrDlC + mrDLN; mrVsT = mrVsC + 48; mrVsV = mrVsT + 48; mrPre = mrVsV + 48; mrDls = mrPre + 4; mrRg = mrDls + 8; mrVbF = mrRg + 24; memset(MR, 0, mrVbF + 4 - MR); mrVsT[0] = mrVsT[16] = mrVsT[32] = 1; mrVbF[0] = 60; mrVbF[1] = 180; mrVbF[2] = 480; mrVbF[3] = 1300; mrCw = 1 - exp(-1/(0.15*srate)); mrCs = 1 - exp(-1/(3*srate)); mrCd = 1 - exp(-1/(0.8*srate)); mrCdr = 1 - exp(-1/(3*srate)); function mr_opc(fc) ( 1 - exp(-2*$pi*min(fc, srate*0.45)/srate); ); function mr_tanh(v) ( v = max(-20, min(20, v)); 1 - 2/(exp(2*v) + 1); ); mrVbLp = mr_opc(160); mrVbAt = 1 - exp(-1/(0.008*srate)); mrDlLc = mr_opc(3500); mrDlHc = mr_opc(70); mrDlTs = 1 - exp(-1/(0.25*srate)); mrDlT = 350; function mr_div(i, md) ( (i == 0 ? 4*mrBar : i == 1 ? 2*mrBar : i == 2 ? mrBar : i == 3 ? 2 : i == 4 ? 1 : i == 5 ? 0.5 : i == 6 ? 0.25 : 0.125)*(md == 2 ? 1.5 : md == 3 ? 2/3 : 1); ); function mr_hread(buf, n, pos) local(i, f, xm1, x0, x1, x2, c1, c2, c3) ( pos < 0 ? pos += n; pos >= n ? pos -= n; i = floor(pos); f = pos - i; xm1 = buf[(i - 1 + n) % n]; x0 = buf[i]; x1 = buf[(i + 1) % n]; x2 = buf[(i + 2) % n]; c1 = 0.5*(x1 - xm1); c2 = xm1 - 2.5*x0 + 2*x1 - 0.5*x2; c3 = 0.5*(x2 - xm1) + 1.5*(x0 - x1); ((c3*f + c2)*f + c1)*f + x0; ); function mr_rgen(q, period, coef) ( q[0] -= 1; q[0] <= 0 ? ( q[0] = period*srate; q[1] = rand(2) - 1; ); q[2] += coef*(q[1] - q[2]); q[2]; ); function mr_ch(buf, phoff, vs) local(lf, dms, y) ( lf = sin(2*$pi*(mrChPh + phoff)); dms = mrChBase + mrChDep*lf + mrWarb; y = mr_hread(buf, mrCHN, mrChW - max(1, dms)*srate*0.001); mrClkOn ? ( vs[0] += mrClkInc; vs[0] >= 1 ? ( vs[0] -= 1; vs[1] = y; ); y = vs[1]; ); vs[2] += mrChPc*(y - vs[2]); vs[3] += mrChPc*(vs[2] - vs[3]); vs[3]; ); function mr_tr(phoff, vs) local(sv, sh, g) ( sv = sin(2*$pi*(mrTrPh + phoff)); sh = mrTrK > 1.01 ? mr_tanh(mrTrK*sv)/mrTrTk : sv; g = 1 - mrTrDep*(0.5 - 0.5*sh); vs[0] += mrTrLag*(g - vs[0]); vs[0]; ); function mr_vb(x, phoff, vs) local(q, pw, lf, c, rr, oc, k, y, f, t, a1, xi) ( q = mrVbPh + phoff; q -= floor(q); pw = q < mrVbSk ? 0.5*q/mrVbSk : 0.5 + 0.5*(q - mrVbSk)/(1 - mrVbSk); lf = 0.5 - 0.5*cos(2*$pi*pw); c = lf > vs[8] ? mrVbAt : mrVbRl; vs[8] += c*(lf - vs[8]); rr = vs[8]; oc = mrVbOct*rr; y = x; k = 0; loop(4, f = min(srate*0.45, mrVbF[k]*2^oc); t = tan($pi*f/srate); a1 = (t - 1)/(t + 1); xi = y; y = a1*xi + vs[k*2] - a1*vs[k*2 + 1]; vs[k*2] = xi; vs[k*2 + 1] = y; k += 1; ); vs[9] += mrVbLp*(x - vs[9]); mrVbWet*(0.5*(y - x) + mrVbTh*(2*rr - 1)*vs[9]); ); function mr_loop(y, q) local(v) ( q[0] += mrDlLc*(y - q[0]); q[1] += mrDlHc*(q[0] - q[1]); v = q[0] - q[1]; mr_tanh(v*mrFbE*1.15)/1.15; ); // the controls (each block) function mr_update() local(st, fclk, chop, asym) ( mrChLo = slider84 > 0.5; mrChCo = slider85 > 0.5; mrChRo = slider86 > 0.5; mrTrLo = slider94 > 0.5; mrTrCo = slider95 > 0.5; mrTrRo = slider96 > 0.5; mrVbLo = slider104 > 0.5; mrVbCo = slider105 > 0.5; mrVbRo = slider106 > 0.5; mrDlLo = slider114 > 0.5; mrDlCo = slider115 > 0.5; mrDlRo = slider116 > 0.5; st = slider83/100; mrChBase = 7 + 18*st; mrChDep = slider81/100*(3 + 4*st); mrSt = st; fclk = 40000*(1 - 0.88*st); mrClkOn = fclk < srate*0.98; mrClkInc = fclk/srate; mrChPc = mr_opc(min(14000, fclk*0.42)); mrChMix = slider82/100; chop = slider93/100; mrTrK = 1 + 40*chop*chop; mrTrTk = mr_tanh(mrTrK); mrTrDep = slider91/100; mrTrLag = 1 - exp(-1/((0.3 + 5.7*(1 - chop))*0.001*srate)); asym = slider103/100; mrVbSk = 0.5 - 0.38*asym; mrVbRl = 1 - exp(-1/((0.04 + 0.25*asym)*srate)); mrVbTh = 0.9*asym; mrVbOct = 3*slider101/100; mrVbWet = min(1, 2*slider101/100); mrRun = slider113/100; mrFbE = 0.95*slider111/95 + 0.30*mrRun; mrDlMix = slider112/100; ); // tempo (each block) function mr_block() ( mrBar = ts_denom > 0 ? ts_num*4/ts_denom : 4; mrPlay = play_state & 1; mrBpos = beat_position; mrBpInc = tempo/(60*srate); mrChSy = slider87 > 0.5; mrChQn = mr_div(slider88, slider87); mrTrSy = slider97 > 0.5; mrTrQn = mr_div(slider98, slider97); mrVbSy = slider107 > 0.5; mrVbQn = mr_div(slider108, slider107); mrDlTgt = slider117 > 0.5 && tempo > 0 ? min(1500, mr_div(slider118, slider117)*60000/tempo) : slider110; mrOn = mrChMix > 0 || mrTrDep > 0 || mrVbWet > 0 || mrDlMix > 0; ); // one sample: in mrL / mrR, out mrL / mrR function mr_run() local(xl, xr, m, dl, dr, y, sp, kc, ws, wc, dsm, dmod, ya, yb, yc) ( xl = mrL; xr = mrR; m = 0.5*(xl + xr); dl = dr = 0; mrBpos += mrBpInc; mrChSy ? mrChPh = (mrPlay ? mrBpos/mrChQn : mrChPh + mrBpInc/mrChQn) : mrChPh += slider80*(1 + 0.2*drift*mr_rgen(mrRg, 2.5, mrCdr))/srate; mrTrSy ? mrTrPh = (mrPlay ? mrBpos/mrTrQn : mrTrPh + mrBpInc/mrTrQn) : mrTrPh += slider90*(1 + 0.2*drift*mr_rgen(mrRg + 3, 2.5, mrCdr))/srate; mrVbSy ? mrVbPh = (mrPlay ? mrBpos/mrVbQn : mrVbPh + mrBpInc/mrVbQn) : mrVbPh += slider100*(1 + 0.2*drift*mr_rgen(mrRg + 6, 2.5, mrCdr))/srate; mrChPh -= floor(mrChPh); mrTrPh -= floor(mrTrPh); mrVbPh -= floor(mrVbPh); // chorus mrWarb = mrSt*(2.5*mr_rgen(mrRg + 9, 0.3, mrCw) + 4*mr_rgen(mrRg + 12, 4, mrCs)); mrPre[0] += mrChPc*(xl - mrPre[0]); mrPre[1] += mrChPc*(xr - mrPre[1]); mrPre[2] += mrChPc*(m - mrPre[2]); mrChA[mrChW] = mrPre[0]; mrChB[mrChW] = mrPre[1]; mrChC[mrChW] = mrPre[2]; mrChMix > 0 ? ( sp = mrChCo && (mrChLo || mrChRo); kc = (mrChLo || mrChRo) ? 0.707 : 1; mrChLo ? dl += mrChMix*mr_ch(mrChA, 0, mrVsC); mrChRo ? dr += mrChMix*mr_ch(mrChB, sp ? 2/3 : 0.25, mrVsC + 16); mrChCo ? ( y = mrChMix*kc*mr_ch(mrChC, sp ? 1/3 : 0, mrVsC + 32); dl += y; dr += y; ); ); // tremolo mrTrDep > 0 ? ( sp = mrTrCo && (mrTrLo || mrTrRo); ws = mrTrCo ? 0.5 : 1; wc = (mrTrLo || mrTrRo) ? 0.5 : 1; mrTrLo ? dl += ws*xl*(mr_tr(0, mrVsT) - 1); mrTrRo ? dr += ws*xr*(mr_tr(sp ? 2/3 : 0, mrVsT + 16) - 1); mrTrCo ? ( y = wc*m*(mr_tr(sp ? 1/3 : 0, mrVsT + 32) - 1); dl += y; dr += y; ); ); // vibe mrVbWet > 0 ? ( sp = mrVbCo && (mrVbLo || mrVbRo); kc = (mrVbLo || mrVbRo) ? 0.707 : 1; mrVbLo ? dl += mr_vb(xl, 0, mrVsV); mrVbRo ? dr += mr_vb(xr, sp ? 2/3 : 0, mrVsV + 16); mrVbCo ? ( y = kc*mr_vb(m, sp ? 1/3 : 0, mrVsV + 32); dl += y; dr += y; ); ); // delay mrDlT += mrDlTs*(mrDlTgt - mrDlT); mrWow += 0.45/srate; mrWow -= floor(mrWow); mrFl += 6.3/srate; mrFl -= floor(mrFl); dmod = mrRun*(5*sin(2*$pi*mrWow) + 0.5*sin(2*$pi*mrFl) + 2.5*mr_rgen(mrRg + 15, 1.2, mrCd)); dsm = max(2, min(mrDLN*0.55, (mrDlT + dmod)*srate*0.001)); sp = mrDlCo && (mrDlLo || mrDlRo); kc = (mrDlLo || mrDlRo) ? 0.707 : 1; mrDlLo && mrDlMix > 0 ? ( ya = mr_hread(mrDlA, mrDLN, mrDlW - dsm*(sp ? 0.75 : 1)); mrDlA[mrDlW] = xl + mr_loop(ya, mrDls); dl += mrDlMix*ya; ) : mrDlA[mrDlW] = 0; mrDlRo && mrDlMix > 0 ? ( yb = mr_hread(mrDlB, mrDLN, mrDlW - dsm*(sp ? 1.25 : 1)); mrDlB[mrDlW] = xr + mr_loop(yb, mrDls + 2); dr += mrDlMix*yb; ) : mrDlB[mrDlW] = 0; mrDlCo && mrDlMix > 0 ? ( yc = mr_hread(mrDlC, mrDLN, mrDlW - dsm); mrDlC[mrDlW] = m + mr_loop(yc, mrDls + 4); y = mrDlMix*kc*yc; dl += y; dr += y; ) : mrDlC[mrDlW] = 0; mrChW += 1; mrChW >= mrCHN ? mrChW = 0; mrDlW += 1; mrDlW >= mrDLN ? mrDlW = 0; mrL = xl + dl; mrR = xr + dr; ); function update() ( vmode = floor(slider5 + 0.5); UNI = vmode == 2 ? 1 : 0; glide_k = slider6 > 0 ? 1 - (1 - vo_coef(slider6))^16 : 1; VELS = slider7/100; drift = slider3/100; chan = slider4; D1F = slider9; D1SH = slider10/100; D1W = slider11 > 0.5; D1P = slider12 > 0.5; D1PW = slider13/100; D2F = slider14; D2DET = slider15; D2SH = slider16/100; D2W = slider17 > 0.5; D2P = slider18 > 0.5; D2PW = slider19/100; D2N = slider20 > 0.5; SYNC = slider21 > 0.5; MIX = slider22/100; CUT = slider23; RES = slider24/100; VENV = slider25/100; VKEY = slider26/100; VFM = slider27/100; E1D = slider28*0.001*srate; E1A = 1/max(1, slider29*0.001*srate); E1DC = ms_(slider30); E1S = slider31/100; E1R = ms_(slider32); E2D = slider33*0.001*srate; E2A = 1/max(1, slider34*0.001*srate); E2DC = ms_(slider35); E2S = slider36/100; E2R = ms_(slider37); L1SP = slider43; L1W = slider44; L1AMT = slider45; L2SP = slider46; L2W = slider47; L2AMT = slider48/100; VVEL = slider73/100; L1DI = slider74 > 0 ? 1/max(1, slider74*0.001*srate) : 1; L2D = floor(slider75 + 0.5); PENV = slider76; PTGT = slider77 > 0.5; mr_update(); vol_t = 10^((slider2 + slider72)/20); ins_output_setup(66); ); function load_patch(p) local(i, o) ( p = min(max(floor(p + 0.5), 0), 99); o = PB + p*128; i = 0; loop(NPF, slider(PSL[i]) = o[i]; i += 1; ); slider1 = p; last_patch = p; ui_auto(1); i = 0; loop(NPF, ui_auto(PSL[i]); i += 1; ); panic_req = 1; update(); ); v0.vinit(-0.30, -12); v1.vinit(0.30, 12); v2.vinit(-0.15, -6); v3.vinit(0.15, 6); v4.vinit(-0.06, -2.5); v5.vinit(0.06, 2.5); ins_drift_init(); ost_init(20000); ostL.ost_ch_init(); ostR.ost_ch_init(); sm = 1 - exp(-1/(0.03*srate)); bend_st = 0; modw = 0; atch = 0; pedal = 0; hcount = 0; vage = 0; qcount = 0; msus = 0; last_patch = -1; // the first block adopts the saved patch number without reloading it !ui_dflt ? ( ui_sz = 2; m1k_face = 0; m1k_edit = 0; m1k_cat = 0; ); update(); vol_s = vol_t; ui_dflt = 1; @slider update(); @block update(); // a patch chosen from Reaper's parameter list or automation loads here (not when a saved project restores) last_patch < 0 ? last_patch = slider1 : slider1 != last_patch ? load_patch(slider1); qcount = 0; while (midirecv(mofs, m1, m2, m3)) ( ins_chan_ok(m1, chan) ? ( st = m1 & 0xF0; st == 0x90 || st == 0x80 ? ( q_push(mofs, st == 0x90 && m3 > 0, m2, m3); st == 0x90 && m3 > 0 ? ins_midi_hit(); ) : st == 0xE0 ? bend_st = (((m3*128 + m2) - 8192)/8192)*slider8 : st == 0xD0 ? atch = m2/127 : st == 0xB0 ? ( m2 == 1 ? modw = m3/127 : m2 == 64 ? ( pedal = m3 >= 64; !pedal ? q_push(mofs, 2, 0, 0); ) : m2 == 123 || m2 == 120 ? q_push(mofs, 3, 0, 0); ); ); ); vmode != last_vm ? ( q_push(0, 3, 0, 0); last_vm = vmode; ); panic_req ? ( all_off(); panic_req = 0; ); eqi = 0; spos = 0; mr_block(); ins_drift_block(drift, samplesblock); dvi = 0.35*samplesblock/srate; v0.vblock(dvi); v1.vblock(dvi); v2.vblock(dvi); v3.vblock(dvi); v4.vblock(dvi); v5.vblock(dvi); @serialize file_var(0, ui_sz); file_var(0, m1k_face); file_var(0, m1k_edit); file_var(0, m1k_cat); @sample while (eqi < qcount && EQO[eqi] <= spos) ( et = EQT[eqi]; et == 1 ? note_on(EQN[eqi], EQV[eqi]) : et == 0 ? note_off(EQN[eqi]) : et == 2 ? pedal_up() : all_off(); eqi += 1; ); spos += 1; lfo1v = lf1.lfo(L1SP, L1W); lfo2v = lf2.lfo(L2SP, L2W); y0 = v0.vrun(); y1 = v1.vrun(); y2 = v2.vrun(); y3 = v3.vrun(); y4 = v4.vrun(); y5 = v5.vrun(); pan0 = vmode == 1 ? 0 : v0.pan; oL = y0*(1 - max(pan0, 0)) + y1*(1 - max(v1.pan, 0)) + y2*(1 - max(v2.pan, 0)) + y3*(1 - max(v3.pan, 0)) + y4*(1 - max(v4.pan, 0)) + y5*(1 - max(v5.pan, 0)); oR = y0*(1 + min(pan0, 0)) + y1*(1 + min(v1.pan, 0)) + y2*(1 + min(v2.pan, 0)) + y3*(1 + min(v3.pan, 0)) + y4*(1 + min(v4.pan, 0)) + y5*(1 + min(v5.pan, 0)); vol_s += (vol_t - vol_s)*sm; gsc = UNI ? 0.32 : 0.6; mrL = oL*gsc; mrR = oR*gsc; mrOn ? mr_run(); oL = ostL.ost_band(mrL)*vol_s; oR = ostR.ost_band(mrR)*vol_s; ost_out(oL, oR); spl0 = ost_l; spl1 = ost_r; @gfx 960 570 // ===================================================================== // GUI - the single-space rack unit along the top (black or cream faceplate); page 1 underneath lists every // patch (click a name to load it), EDIT opens page 2, the editor; and the PLAY strip along the bottom. Design space 1280 x 760 at qs = 0.75 * sc. // ===================================================================== ui_begin(960, 570); qs = sc*0.75; gfx_setfont(8, "Trebuchet MS", 13*qs, 'b'); gfx_setfont(9, "Courier New", 22*qs, 'b'); gfx_setfont(10, "Courier New", 15*qs, 'b'); gfx_setfont(11, "Trebuchet MS", 15*qs, 'b'); gfx_setfont(12, "Trebuchet MS", 40*qs, 'b'); gfx_setfont(13, "Trebuchet MS", 17*qs, 'b'); gfx_setfont(14, "Trebuchet MS", 19*qs, 'b'); // patch list names gfx_setfont(15, "Courier New", 18*qs, 'b'); // patch list numbers RED = 0xFF3A2A; AMB = 0xFFB030; GRN = 0x46D86A; m1k_face ? ( FP = 0xE4DCC6; FP2 = 0xD9D0B9; FP3 = 0xCFC5AC; EAR = 0xBDB49C; INK = 0x24211B; INK2 = 0x5C564A; ACC = 0x2C6CB0; KC = 0x6A6F76; ) : ( FP = 0x151618; FP2 = 0x1C1D20; FP3 = 0x232428; EAR = 0x0D0E0F; INK = 0xE4E4E2; INK2 = 0x9CA0A6; ACC = 0x5AA8E6; KC = 0x9DA2A8; ); function R(x, y, w, h) ( gfx_rect(x*qs, y*qs, max(1, w*qs), max(1, h*qs)); ); function RR(x, y, w, h, r) ( rd_rr(x*qs, y*qs, w*qs, h*qs, r*qs); ); function TX(x, y, t) ( gfx_x = x*qs; gfx_y = y*qs; gfx_drawstr(t); ); function TC(cx, y, t) local(w, h) ( gfx_measurestr(t, w, h); gfx_x = cx*qs - w*0.5; gfx_y = y*qs; gfx_drawstr(t); ); function inbox(x, y, w, h) ( mouse_x >= x*qs && mouse_x < (x + w)*qs && mouse_y >= y*qs && mouse_y < (y + h)*qs; ); function hitbox(x, y, w, h) local(h_) ( h_ = pressed && drag_id == 0 && inbox(x, y, w, h); h_ ? drag_id = -1; h_; ); function setmsg(n, v) ( strcpy(#lcdn, n); strcpy(#lcdv, v); lcd_t = time_precise(); ); function setv(idx, v) ( slider(idx) = v; ui_auto(idx); ); function tog(idx) ( slider(idx) = slider(idx) < 0.5; ui_auto(idx); ); function touch(idx, name, val) ( drag_id == 1600 + idx ? setmsg(name, val); ); // knob: the value shows on hover / drag only (house style); its name goes to the display while turning function knob(idx, cx, cy, r, lo, hi, def, lg, label, val) ( dy_kst = 7; dy_ink = INK; dy_ntick = 11; dy_knob(cx*0.75, cy*0.75, r*0.75, idx, lo, hi, def, lg, KC, label, val); touch(idx, label, val); ); function sknob(idx, cx, cy, r, lo, hi, def, label, val) ( // stepped (whole numbers) knob(idx, cx, cy, r, lo, hi, def, 0, label, val); slider(idx) != floor(slider(idx) + 0.5) ? slider(idx) = floor(slider(idx) + 0.5); ); function key(x, y, w, h, on, c, cap) local(hit) ( rd_sqbg = m1k_face ? 0x8A8370 : 0x0E0E10; hit = rd_sq(x*0.75, y*0.75, w*0.75, h*0.75, on, c, ""); gfx_setfont(8); ui_col(INK); TC(x + w*0.5, y + h + 5, cap); hit; ); // a clickable value box (opens a list) function box(x, y, w, h, t) local(hov) ( hov = inbox(x, y, w, h); ui_col(m1k_face ? 0xF4EFE2 : 0x0B0B0C); R(x, y, w, h); ui_cola(INK, hov ? 0.6 : 0.25); gfx_rect(x*qs, y*qs, w*qs, h*qs, 0); gfx_setfont(8); ui_col(INK); gfx_x = (x + 8)*qs; gfx_y = (y + h*0.5 - 7)*qs; gfx_drawstr(t); ui_cola(INK, 0.5); TX(x + w - 16, y + h*0.5 - 7, "v"); hitbox(x, y, w, h); ); function sect(x, y, w, h, t) ( ui_col(FP3); RR(x, y, w, h, 6); ui_col(FP2); RR(x + 2, y + 2, w - 4, h - 4, 5); gfx_setfont(11); ui_col(ACC); TX(x + 12, y + 8, t); ); function fms(v) ( v >= 1000 ? sprintf(#vt, "%.2f s", v/1000) : v >= 10 ? sprintf(#vt, "%d ms", floor(v + 0.5)) : sprintf(#vt, "%.1f ms", v); #vt; ); function fpc(v) ( sprintf(#vt, "%d%%", floor(v + 0.5)); #vt; ); function fsp(v) ( sprintf(#vt, "%.0f%%", v); #vt; ); function menu_set(idx, list, x, y) local(k) ( gfx_x = x*qs; gfx_y = y*qs; k = gfx_showmenu(list); k > 0 ? setv(idx, k - 1); ); #L2D = "To PW|To cutoff|To pitch"; // a small lit switch with its text inside function chip(x, y, w, h, t, on) local(hov) ( hov = inbox(x, y, w, h); ui_col(on ? ACC : (m1k_face ? 0xF4EFE2 : 0x0B0B0C)); RR(x, y, w, h, 4); ui_cola(INK, hov ? 0.6 : 0.3); gfx_rect(x*qs, y*qs, w*qs, h*qs, 0); gfx_setfont(8); ui_col(on ? (m1k_face ? 0xFFFFFF : 0x0B0C0D) : INK); TC(x + w*0.5, y + h*0.5 - 7, t); hitbox(x, y, w, h); ); function fdiv(i, md) ( strcpy(#dv, i == 0 ? "4 BARS" : i == 1 ? "2 BARS" : i == 2 ? "1 BAR" : i == 3 ? "1/2" : i == 4 ? "1/4" : i == 5 ? "1/8" : i == 6 ? "1/16" : "1/32"); md == 2 ? strcat(#dv, " D") : md == 3 ? strcat(#dv, " T"); #dv; ); // one Mod Rack module: b = first slider, kind 0 tremolo, 1 chorus, 2 vibe, 3 delay function mrmod(mx, b, kind) local(md, k, on, x_) ( ui_col(FP3); RR(mx, 542, 296, 146, 6); gfx_setfont(11); ui_col(ACC); TX(mx + 12, 554, kind == 0 ? "TREMOLO" : kind == 1 ? "CHORUS" : kind == 2 ? "VIBE" : "DELAY"); md = floor(slider(b + 7) + 0.5); chip(mx + 150, 552, 80, 22, md == 0 ? "SYNC" : md == 1 ? "SYNC" : md == 2 ? "SYNC D" : "SYNC T", md > 0) ? ( setv(b + 7, (md + 1) % 4); setmsg(kind == 3 ? "DELAY TIME" : "RATE", md == 0 ? "SYNC STRAIGHT" : md == 1 ? "SYNC DOTTED" : md == 2 ? "SYNC TRIPLET" : kind == 3 ? "IN MS" : "IN HZ"); ); md > 0 ? ( sknob(b + 8, mx + 34, 614, 18, 0, 7, 4, kind == 3 ? "TIME" : "RATE", fdiv(slider(b + 8), md)); ) : kind == 3 ? ( knob(b, mx + 34, 614, 18, 20, 1500, 350, 1, "TIME", fms(slider(b))); ) : ( sprintf(#mr0, "%.2f Hz", slider(b)); knob(b, mx + 34, 614, 18, kind == 1 ? 0.05 : 0.1, kind == 1 ? 8 : kind == 0 ? 15 : 12, 1, 1, "RATE", #mr0); ); kind == 3 ? knob(b + 1, mx + 88, 614, 18, 0, 95, 30, 0, "FDBK", fpc(slider(b + 1))) : knob(b + 1, mx + 88, 614, 18, 0, 100, 50, 0, "DEPTH", fpc(slider(b + 1))); x_ = mx + 142; kind == 1 || kind == 3 ? ( knob(b + 2, x_, 614, 18, 0, 100, 0, 0, "MIX", fpc(slider(b + 2))); x_ += 54; ); knob(b + 3, x_, 614, 18, 0, 100, 0, 0, kind == 0 ? "CHOP" : kind == 1 ? "STRETCH" : kind == 2 ? "LAMP" : "RUNAWAY", fpc(slider(b + 3))); k = 0; loop(3, on = slider(b + 4 + k) > 0.5; chip(mx + 254, 584 + k*30, 34, 24, k == 0 ? "L" : k == 1 ? "C" : "R", on) ? tog(b + 4 + k); k += 1; ); ); #LFW = "Triangle|Saw up|Saw down|Square|Random|Noise"; // --------------------------------------------------------------------- ui_col(EAR); gfx_rect(0, 0, gfx_w, gfx_h); // ---- the rack unit ---- ui_col(EAR); R(0, 0, 1280, 182); k = 0; loop(2, ui_col(m1k_face ? 0x8F8771 : 0x050506); RR(k ? 1250 : 12, 40, 18, 30, 9); RR(k ? 1250 : 12, 112, 18, 30, 9); k += 1; ); ui_col(FP); R(40, 8, 1200, 166); gfx_gradrect(40*qs, 8*qs, 1200*qs, 60*qs, 1, 1, 1, m1k_face ? 0.10 : 0.05, 0, 0, 0, 0, 0, 0, 0, -(m1k_face ? 0.10 : 0.05)/(60*qs)); ui_cola(0x000000, 0.35); R(40, 172, 1200, 2); ui_cola(0xFFFFFF, m1k_face ? 0.6 : 0.12); R(40, 8, 1200, 1); ui_col(ACC); R(40, 8, 1200, 4); // logo ui_col(ACC); gfx_circle(84*qs, 66*qs, 22*qs, 1, 1); gfx_setfont(2); ui_col(m1k_face ? 0xFFFFFF : 0x0B0C0D); ui_text(84*qs, 59*qs, "GFX"); gfx_setfont(12); ui_col(INK); TX(118, 40, "G M1K"); gfx_setfont(8); ui_col(INK2); TX(120, 92, "SIX-VOICE ANALOGUE MODULE"); gfx_setfont(8); ui_col(INK2); TX(120, 136, "1 0 0 P A T C H E S"); // patch number (red LED) and name window ui_col(0x050505); R(384, 40, 168, 96); ui_col(0x140405); R(388, 44, 160, 88); sprintf(#pnum, "%03d", slider1); rd_seg(402*0.75, 58*0.75, 30*0.75, 58*0.75, 3, #pnum, 0xFF3020, 0x2A0A08); ui_col(0x050505); R(566, 40, 330, 96); ui_col(0x06100F); R(570, 44, 322, 88); gfx_setfont(10); ui_col(0x6FE8D4); time_precise() - lcd_t < 1.5 ? ( TX(584, 54, #lcdn); gfx_setfont(9); TX(584, 82, #lcdv); ) : ( TX(584, 54, cat_name(cat_of(slider1))); gfx_setfont(9); TX(584, 82, 100 + floor(slider1 + 0.5)); ); hitbox(566, 40, 330, 96) ? ( // the whole bank as a two-level list #pm = ""; c_ = 0; loop(7, strcat(#pm, ">"); strcat(#pm, cat_name(c_)); strcat(#pm, "|"); p_ = cat_start(c_); loop(cat_start(c_ + 1) - cat_start(c_), p_ + 1 == cat_start(c_ + 1) ? strcat(#pm, "<"); p_ == slider1 ? strcat(#pm, "!"); sprintf(#pe, "%03d %s", p_, 100 + p_); strcat(#pm, #pe); strcat(#pm, "|"); p_ += 1; ); c_ += 1; ); gfx_x = mouse_x; gfx_y = mouse_y; k = gfx_showmenu(#pm); k > 0 ? ( load_patch(k - 1); m1k_cat = cat_of(k - 1); ); ); ui_button(910*qs, 50*qs, 46*qs, 76*qs, "<", 0, 1) ? ( load_patch(slider1 <= 0 ? 99 : slider1 - 1); m1k_cat = cat_of(slider1); ); ui_button(962*qs, 50*qs, 46*qs, 76*qs, ">", 0, 1) ? ( load_patch(slider1 >= 99 ? 0 : slider1 + 1); m1k_cat = cat_of(slider1); ); key(1030, 44, 74, 30, m1k_edit, AMB, "EDIT") ? m1k_edit = !m1k_edit; key(1030, 104, 74, 30, m1k_face, m1k_face ? 0xE4DCC6 : 0x6A6F76, m1k_face ? "CREAM" : "BLACK") ? m1k_face = !m1k_face; rd_led(1132*0.75, 56*0.75, 6*0.75, ins_midi_lit(), GRN); gfx_setfont(8); ui_col(INK2); TX(1144, 50, "MIDI"); sprintf(#vv, "%+.1f dB", slider2); knob(2, 1170, 112, 24, -24, 6, 0, 0, "VOLUME", #vv); // --------------------------------------------------------------------- ui_col(FP2); R(0, 182, 1280, 578); ui_cola(0x000000, 0.25); R(0, 182, 1280, 3); !m1k_edit ? ( // ---- page 1: every patch, start to finish, under its bank heading - click a name to load it ---- e_ = 0; p_ = 0; c_ = 0; loop(107, col_ = floor(e_/22); row_ = e_ % 22; tx_ = 24 + col_*248; ty_ = 192 + row_*22.6; p_ == cat_start(c_) && c_ < 7 ? ( gfx_setfont(14); ui_col(ACC); TX(tx_ + 6, ty_ + 1, cat_name(c_)); ui_cola(ACC, 0.5); R(tx_ + 6, ty_ + 21, 228, 1); c_ += 1; ) : ( on_ = p_ == slider1; hv_ = inbox(tx_, ty_, 238, 21); on_ ? ( ui_col(ACC); RR(tx_, ty_, 240, 22, 4); ) : hv_ ? ( ui_col(FP3); RR(tx_, ty_, 240, 22, 4); ); gfx_setfont(15); ui_col(on_ ? (m1k_face ? 0xFFFFFF : 0x0B0C0D) : INK2); sprintf(#pe, "%03d", p_); TX(tx_ + 6, ty_ + 2, #pe); gfx_setfont(14); ui_col(on_ ? (m1k_face ? 0xFFFFFF : 0x0B0C0D) : INK); TX(tx_ + 48, ty_ + 1, 100 + p_); hitbox(tx_, ty_, 238, 21) ? ( load_patch(p_); m1k_cat = cat_of(p_); ); p_ += 1; ); e_ += 1; ); ) : ( // ---- editor ---- // row 1: DCO 1 | DCO 2 | MIX | VCF sect(30, 194, 312, 164, "DCO 1"); key(46, 228, 64, 26, slider11 > 0.5, ACC, "WAVE") ? tog(11); key(46, 290, 64, 26, slider12 > 0.5, ACC, "PULSE") ? tog(12); sprintf(#v9, "%+d st", slider9); sknob(9, 160, 272, 22, -24, 24, 0, "FREQ", #v9); knob(10, 228, 272, 22, 0, 100, 0, 0, "SHAPE", slider10 < 1 ? "SAW" : slider10 > 99 ? "TRI" : fpc(slider10)); knob(13, 296, 272, 22, 5, 95, 50, 0, "PW", fpc(slider13)); sect(352, 194, 438, 164, "DCO 2"); key(368, 228, 64, 26, slider17 > 0.5, ACC, "WAVE") ? tog(17); key(442, 228, 64, 26, slider18 > 0.5, ACC, "PULSE") ? tog(18); key(368, 290, 64, 26, slider20 > 0.5, AMB, "NOISE") ? tog(20); key(442, 290, 64, 26, slider21 > 0.5, RED, "SYNC") ? tog(21); sprintf(#v14, "%+d st", slider14); sknob(14, 552, 272, 22, -24, 24, 0, "FREQ", #v14); sprintf(#v15, "%+.1f c", slider15); knob(15, 618, 272, 22, -50, 50, 7, 0, "DETUNE", #v15); knob(16, 684, 272, 22, 0, 100, 0, 0, "SHAPE", slider16 < 1 ? "SAW" : slider16 > 99 ? "TRI" : fpc(slider16)); knob(19, 750, 272, 22, 5, 95, 50, 0, "PW", fpc(slider19)); sect(800, 194, 100, 164, "MIX"); knob(22, 850, 272, 26, 0, 100, 50, 0, "1 / 2", slider22 < 1 ? "DCO 1" : slider22 > 99 ? "DCO 2" : fpc(slider22)); sect(910, 194, 340, 164, "VCF"); sprintf(#v23, "%d Hz", floor(slider23 + 0.5)); knob(23, 954, 272, 24, 20, 18000, 2000, 1, "CUTOFF", #v23); knob(24, 1012, 272, 19, 0, 100, 15, 0, "RES", fpc(slider24)); sprintf(#v25, "%+d%%", slider25); knob(25, 1062, 272, 19, -100, 100, 40, 0, "ENV 1", #v25); knob(26, 1112, 272, 18, 0, 100, 50, 0, "KEY", fpc(slider26)); knob(27, 1160, 272, 18, 0, 100, 0, 0, "FM", fpc(slider27)); knob(73, 1208, 272, 18, 0, 100, 0, 0, "VEL", fpc(slider73)); // row 2: ENV 1 (VCF + pitch) | ENV 2 (VCA) | LFO 1 | LFO 2 e_ = 0; loop(2, ex_ = e_ == 0 ? 30 : 440; ib_ = 28 + e_*5; sp_ = 60; sect(ex_, 364, e_ == 0 ? 400 : 320, 164, e_ == 0 ? "ENV 1 - VCF" : "ENV 2 - VCA"); knob(ib_, ex_ + 40, 440, 18, 0, 3000, 0, 0, "DLY", fms(slider(ib_))); knob(ib_ + 1, ex_ + 40 + sp_, 440, 18, 0.5, 8000, 2, 1, "ATK", fms(slider(ib_ + 1))); knob(ib_ + 2, ex_ + 40 + 2*sp_, 440, 18, 5, 10000, 400, 1, "DEC", fms(slider(ib_ + 2))); knob(ib_ + 3, ex_ + 40 + 3*sp_, 440, 18, 0, 100, 50, 0, "SUS", fpc(slider(ib_ + 3))); knob(ib_ + 4, ex_ + 40 + 4*sp_, 440, 18, 5, 10000, 300, 1, "REL", fms(slider(ib_ + 4))); e_ += 1; ); ui_cola(INK, 0.2); R(342, 392, 1, 120); sprintf(#v76, "%+.1f st", slider76); knob(76, 386, 440, 18, -24, 24, 0, 0, "PITCH", #v76); chip(356, 492, 60, 22, slider77 > 0.5 ? "BOTH" : "DCO 2", 0) ? tog(77); sect(770, 364, 230, 164, "LFO 1 - VIBRATO"); sprintf(#v43, "%.2f Hz", slider43); knob(43, 816, 432, 18, 0.05, 30, 5, 1, "SPEED", #v43); sprintf(#v45, "%d c", slider45); knob(45, 884, 432, 18, 0, 100, 0, 0, "DEPTH", #v45); knob(74, 952, 432, 18, 0, 5000, 0, 0, "DELAY", fms(slider74)); box(786, 494, 198, 24, lfo_name(slider44)) ? menu_set(44, #LFW, 786, 518); sect(1010, 364, 240, 164, "LFO 2"); sprintf(#v46, "%.2f Hz", slider46); knob(46, 1070, 432, 18, 0.05, 30, 0.6, 1, "SPEED", #v46); knob(48, 1188, 432, 18, 0, 100, 0, 0, "DEPTH", fpc(slider48)); box(1024, 494, 104, 24, lfo_name(slider47)) ? menu_set(47, #LFW, 1024, 518); box(1134, 494, 104, 24, slider75 < 0.5 ? "TO PW" : slider75 < 1.5 ? "TO CUT" : "TO PITCH") ? menu_set(75, #L2D, 1134, 518); // row 3: the Mod Rack (the patch's own effects) sect(30, 534, 1220, 160, ""); mrmod(40, 90, 0); mrmod(342, 80, 1); mrmod(644, 100, 2); mrmod(946, 110, 3); ); // ---- PLAY strip ---- ui_col(FP3); R(0, 700, 1280, 60); ui_cola(0x000000, 0.25); R(0, 700, 1280, 2); gfx_setfont(11); ui_col(ACC); TX(40, 722, "PLAY"); key(100, 712, 60, 24, vmode == 0, ACC, "") ? ( setv(5, 0); setmsg("VOICES", "POLY - 6 VOICES"); ); key(166, 712, 60, 24, vmode == 1, ACC, "") ? ( setv(5, 1); setmsg("VOICES", "MONO - LEGATO"); ); key(232, 712, 60, 24, vmode == 2, ACC, "") ? ( setv(5, 2); setmsg("VOICES", "UNISON - 6 ON 1"); ); gfx_setfont(8); k = 0; loop(3, ui_col(vmode == k ? (m1k_face ? 0xFFFFFF : 0x0B0C0D) : INK); TC(130 + k*66, 717, k == 0 ? "POLY" : k == 1 ? "MONO" : "UNI"); k += 1; ); gfx_setfont(8); ui_col(INK); TX(318, 722, "GLIDE"); knob(6, 394, 728, 13, 0, 1000, 0, 0, "", fms(slider6)); touch(6, "GLIDE", fms(slider6)); TX(432, 722, "VELOCITY"); knob(7, 532, 728, 13, 0, 100, 50, 0, "", fpc(slider7)); touch(7, "VELOCITY", fpc(slider7)); TX(570, 722, "BEND"); sprintf(#vb, "%d st", slider8); sknob(8, 632, 728, 13, 0, 12, 2, "", #vb); touch(8, "BEND RANGE", #vb); TX(670, 722, "DRIFT"); knob(3, 736, 728, 13, 0, 100, 25, 0, "", fpc(slider3)); touch(3, "DRIFT", fpc(slider3)); TX(774, 722, "LEVEL"); sprintf(#vl, "%+.1f dB", slider72); knob(72, 840, 728, 13, -12, 6, 0, 0, "", #vl); touch(72, "PATCH LEVEL", #vl); TX(876, 722, "CH"); box(904, 714, 78, 26, slider4 == 0 ? "OMNI" : sprintf(#ch, "%d", slider4)) ? ( gfx_x = 904*qs; gfx_y = 740*qs; k = gfx_showmenu("Omni|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16"); k > 0 ? setv(4, k - 1); ); ins_io(1000*0.75, 712*0.75, 66, INK); gfx_setfont(8, "Trebuchet MS", 13*qs, 'b'); ui_size_picker(1140*qs, 716*qs); pk_end(); ui_end();