; inspired by Iain McCurdy's rt collection ; Aaron Krister Johnson, 2011 ;YOU MAY NEED TO CHANGE THE DEVICE NUMBER AFTER THE MIDI INPUT FLAG (-M) -+rtaudio=jack -+rtmidi=alsa -Mhw:2,0 -odac:system:playback_ -dm0 sr = 48000 ksmps = 32 nchnls = 2 0dbfs = 1 gaL init 0 gaR init 0 ;FLTK INTERFACE CODE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; LABEL | WIDTH | HEIGHT | X | Y FLpanel "3 osc phase mod...3x3 (incl. feedback) matrix, w/envelopes", 670, 400, 0, 0 ;GENERAL_TEXT_SETTINGS SIZE | FONT | ALIGN | RED | GREEN | BLUE FLlabel 13, 1, 3, 0, 0, 0 ;TEXT BOXES TYPE | FONT | SIZE | WIDTH | HEIGHT | X | Y ih FLbox "Modulator ratios", 1, 1, 14, 170, 20, 30, 15 ih FLbox "Modulation matrix", 1, 1, 14, 170, 20, 30, 135 ih FLbox "2", 1, 1, 14, 30, 15, 38, 165 ih FLbox "1", 1, 1, 14, 30, 15, 88, 165 ih FLbox "0", 1, 1, 14, 30, 15, 138, 165 ih FLbox "Osc. direct mix", 1, 1, 14, 170, 20, 30, 285 ih FLbox "Index 2 envelope", 1, 1, 14, 170, 20, 210, 15 ih FLbox "Index 1 envelope ", 1, 1, 14, 170, 20, 210, 135 ih FLbox "Index 0 envelope", 1, 1, 14, 170, 20, 210, 255 ih FLbox "Filter & Chorus", 1, 1, 14, 170, 20, 440, 15 ih FLbox "Room character", 1, 1, 14, 170, 20, 440, 135 ih FLbox "Keyboard tracking", 1, 1, 14, 170, 20, 440, 255 ;VALUE BOXES MIN | MAX | STEP | TYPE | WIDTH | HEIGHT | X | Y gkmodratio2, gihmodratio2 FLtext "ratio 2", .001, 16, .001, 3, 50, 20, 80, 50 gkmodratio, gihmodratio FLtext "ratio 1", .001, 16, .001, 3, 50, 20, 80, 90 ;; gkindex2_2, gihindex2_2 FLtext "2 ", 0, 16, .001, 3, 50, 20, 30, 185 gkindex2_1, gihindex2_1 FLtext "", 0, 16, .001, 3, 50, 20, 80, 185 gkindex2_0, gihindex2_0 FLtext "", 0, 16, .001, 3, 50, 20, 130, 185 gkindex1_2, gihindex1_2 FLtext "1 ", 0, 16, .001, 3, 50, 20, 30, 215 gkindex1_1, gihindex1_1 FLtext "", 0, 16, .001, 3, 50, 20, 80, 215 gkindex1_0, gihindex1_0 FLtext "", 0, 16, .001, 3, 50, 20, 130, 215 gkindex0_2, gihindex0_2 FLtext "0 ", 0, 16, .001, 3, 50, 20, 30, 245 gkindex0_1, gihindex0_1 FLtext "", 0, 16, .001, 3, 50, 20, 80, 245 gkindex0_0, gihindex0_0 FLtext "", 0, 16, .001, 3, 50, 20, 130, 245 ;; gkmix0, gihmix0 FLtext "0", 0, 2, .001, 3, 50, 20, 30, 335 gkmix1, gihmix1 FLtext "1", 0, 2, .001, 3, 50, 20, 80, 335 gkmix2, gihmix2 FLtext "2", 0, 2, .001, 3, 50, 20, 130, 335 ;;; align text FLsetAlign 4, gihmodratio FLsetAlign 4, gihmodratio2 FLsetAlign 4, gihindex2_2 FLsetAlign 4, gihindex1_2 FLsetAlign 4, gihindex0_2 FLsetAlign 6, gihmix0 FLsetAlign 6, gihmix1 FLsetAlign 6, gihmix2 ;; colors how which indices do feedback ;; (red=self-feedback, pink=back-propagation) FLsetColor 255,0,0,gihindex2_2 FLsetColor 255,0,0,gihindex1_1 FLsetColor 255,0,0,gihindex0_0 FLsetColor 255,128,128,gihindex1_2 FLsetColor 255,128,128,gihindex0_2 FLsetColor 255,128,128,gihindex0_1 ;VALUE DISPLAY BOXES WIDTH | HEIGHT | X | Y idatt2 FLvalue " ", 45, 18, 210, 95 iddec2 FLvalue " ", 45, 18, 260, 95 idslev2 FLvalue " ", 45, 18, 310, 95 idrel2 FLvalue " ", 45, 18, 360, 95 ; idatt1 FLvalue " ", 45, 18, 210, 215 iddec1 FLvalue " ", 45, 18, 260, 215 idslev1 FLvalue " ", 45, 18, 310, 215 idrel1 FLvalue " ", 45, 18, 360, 215 ;; idatt0 FLvalue " ", 45, 18, 210, 335 iddec0 FLvalue " ", 45, 18, 260, 335 idslev0 FLvalue " ", 45, 18, 310, 335 idrel0 FLvalue " ", 45, 18, 360, 335 ;; idcutoff FLvalue " ", 45, 18, 440, 95 idreson FLvalue " ", 45, 18, 490, 95 idchospd FLvalue " ", 45, 18, 540, 95 idchorus FLvalue " ", 45, 18, 590, 95 ;; idpan FLvalue " ", 45, 18, 440, 215 idreverb FLvalue " ", 45, 18, 490, 215 idfco FLvalue " ", 45, 18, 540, 215 idwetdry FLvalue " ", 45, 18, 590, 215 ;; idvelsens FLvalue " ", 45, 18, 440, 335 idmodslope FLvalue " ", 45, 18, 490, 335 idenvslope FLvalue " ", 45, 18, 540, 335 idslpnote FLvalue " ", 45, 18, 590, 335 ;KNOBS MIN | MAX | EXP | TYPE | DISP | WIDTH | X | Y gkatt2, gihatt2 FLknob "Attack", .001, 5, 0, 1, idatt2, 35, 210, 40 gkdec2, gihdec2 FLknob "Decay", 0, 16, 0, 1, iddec2, 35, 260, 40 gkslev2,gihslev2 FLknob " Sustain", 0, 1, 0, 1, idslev2, 35, 310, 40 gkrel2, gihrel2 FLknob " Release", 0, 1, 0, 1, idrel2, 35, 360, 40 ;; gkatt1, gihatt1 FLknob "Attack", .001, 5, 0, 1, idatt1, 35, 210, 160 gkdec1, gihdec1 FLknob "Decay", 0, 16, 0, 1, iddec1, 35, 260, 160 gkslev1, gihslev1 FLknob " Sustain", 0, 1, 0, 1, idslev1, 35, 310, 160 gkrel1, gihrel1 FLknob " Release", 0, 1, 0, 1, idrel1, 35, 360, 160 ;; gkatt0, gihatt0 FLknob "Attack", .001, 5, 0, 1, idatt0, 35, 210, 280 gkdec0, gihdec0 FLknob "Decay", 0, 16, 0, 1, iddec0, 35, 260, 280 gkslev0,gihslev0 FLknob " Sustain", 0, 1, 0, 1, idslev0, 35, 310, 280 gkrel0, gihrel0 FLknob " Release", 0, 1, 0, 1, idrel0, 35, 360, 280 ;; gkcutoff, gihcutoff FLknob "Cutoff", 0, 12000, 0, 1, idcutoff, 35, 440, 40 gkreson, gihreson FLknob "Q", 0, 2, 0, 1, idreson, 35, 490, 40 gkchospd, gihchospd FLknob "MaxSpd.", 0, 8, 0, 1, idchospd, 35, 540, 40 gkchorus, gihchorus FLknob "Chorus", 0, 1, 0, 1, idchorus, 35, 590, 40 ;; gkpan, gihpan FLknob "Pan", 0, 1, 0, 1, idpan, 35, 440, 160 gkreverb, gihreverb FLknob "Rm.size", 0, 1, 0, 1, idreverb, 35, 490, 160 gkfco, gihfco FLknob "Fco", 0, 12000, 0, 1, idfco, 35, 540, 160 gkwetdry, gihwetdry FLknob "Wet/Dry", 0, 1, 0, 1, idwetdry, 35, 590, 160 ;; gkvelsens, gihvelsens FLknob "VelSens.", 0, 1, 0, 1, idvelsens, 35, 440, 280 gkmodslope, gihmodslope FLknob "ModSlp", -1, 1, 0, 1, idmodslope, 35, 490, 280 gkenvslope, gihenvslope FLknob "EnvSlp", -1, 1, 0, 1, idenvslope, 35, 540, 280 gkslpnote, gihslpnote FLknob "SlpCntr", 60, 2000, 0, 1, idslpnote, 35, 590, 280 ;SET INITIAL VALUES VALUE | HANDLE FLsetVal_i 0, gihindex2_2 FLsetVal_i 2, gihindex2_1 FLsetVal_i 1.5, gihindex2_0 FLsetVal_i 0, gihindex1_2 FLsetVal_i 0, gihindex1_1 FLsetVal_i 3.1, gihindex1_0 FLsetVal_i 0, gihindex0_2 FLsetVal_i 0, gihindex0_1 FLsetVal_i 1.7, gihindex0_0 FLsetVal_i 0.5, gihmix2 FLsetVal_i 0.5, gihmix1 FLsetVal_i 2, gihmix0 FLsetVal_i 1.999, gihmodratio FLsetVal_i 5.002, gihmodratio2 FLsetVal_i .001, gihatt2 FLsetVal_i 3.034, gihdec2 FLsetVal_i 0, gihslev2 FLsetVal_i .1, gihrel2 FLsetVal_i .001, gihatt1 FLsetVal_i 2.41, gihdec1 FLsetVal_i 0, gihslev1 FLsetVal_i .1, gihrel1 FLsetVal_i .001, gihatt0 FLsetVal_i 6, gihdec0 FLsetVal_i 0, gihslev0 FLsetVal_i .1, gihrel0 FLsetVal_i 5737.6, gihcutoff FLsetVal_i .252, gihreson FLsetVal_i .5, gihpan FLsetVal_i 5, gihchospd FLsetVal_i .732, gihchorus FLsetVal_i .7, gihreverb FLsetVal_i 8535, gihfco FLsetVal_i .5, gihwetdry FLsetVal_i 1, gihvelsens FLsetVal_i 0, gihmodslope FLsetVal_i 0, gihenvslope FLsetVal_i 256, gihslpnote FLpanel_end FLrun ;RUN THE FLTK WIDGET THREAD ;END OF FLTK INTERFACE CODE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; instr 1 ;FM (PM) INSTRUMENT icps cpstmid 100 ;READ NOTE INFORMATION FROM LIVE MIDI INPUT (CREATE A VARIABLE 'icps' BASED ON RECEIVED NOTE INFORMATION) ivelsens = i(gkvelsens) iamp ampmidi ivelsens ;;READ VELOCITY INFORMATION FROM LIVE MIDI INPUT (CREATE A VARIABLE 'iamp' BASED ON RECEIVED VELOCITY INFORMATION) iamp = iamp + (1-ivelsens) ;; RESCALE ACCORDING TO VELOCITY SENSITIVITY islpnoteref = icps/i(gkslpnote) ikbmod pow islpnoteref, i(gkmodslope) ikbenv pow islpnoteref, i(gkenvslope) i1div2pi = 0.1592 ipanR = i(gkpan) ipanL = 1-ipanR ;;; initialize feedback a0LFeedback init 0 a0RFeedback init 0 a1Feedback init 0 a2Feedback init 0 a1 init 0 a2 init 0 a0L init 0 ;;; cross modulation index matrix: kpeak = iamp * i1div2pi * ikbmod kpeak0_0 = kpeak * gkindex0_0 kpeak0_1 = kpeak * gkindex0_1 kpeak0_2 = kpeak * gkindex0_2 kpeak1_0 = kpeak * gkindex1_0 kpeak1_1 = kpeak * gkindex1_1 kpeak1_2 = kpeak * gkindex1_2 kpeak2_0 = kpeak * gkindex2_0 kpeak2_1 = kpeak * gkindex2_1 kpeak2_2 = kpeak * gkindex2_2 ;;; ENVELOPES kenv2 mxadsr i(gkatt2), i(gkdec2)*ikbenv, i(gkslev2)+0.0001, i(gkrel2)*ikbenv ;LINE SEGMENT ENVELOPE WITH MIDI RELEASE MECHANISM kenv1 mxadsr i(gkatt1), i(gkdec1)*ikbenv, i(gkslev1)+0.0001, i(gkrel1)*ikbenv ;LINE SEGMENT ENVELOPE WITH MIDI RELEASE MECHANISM kenv0 mxadsr i(gkatt0), i(gkdec0)*ikbenv, i(gkslev0)+0.0001, i(gkrel0)*ikbenv ; ;; STEREO "CHORUS" ENRICHMENT USING JITTER kjitL jitter gkchorus*3, .1, gkchospd kjitR jitter gkchorus*3, .1, gkchospd ;;; MODULATORS ;;; ares table a, ifn [, ixmode (1 = normalized 0 to 1)] [, ixoffset] [, iwrap] ;; a2 phasor icps * gkmodratio2 a2 table a2 + (a2Feedback * kpeak2_2) + (a1 * kpeak1_2) + (a0L * kpeak0_2), 1, 1, 0, 1 a2 = a2 * kenv2 a1 phasor icps * gkmodratio a1 table a1 + (a1Feedback*kpeak1_1) + (a2 * kpeak2_1) + (a0L * kpeak0_1), 1, 1, 0, 1 a1 = a1 * kenv1 a0L phasor icps + kjitL a0R phasor icps + kjitR a0L table a0L + (a0LFeedback * kpeak0_0) + (a1 * kpeak1_0) + (a2 * kpeak2_0), 1, 1, 0, 1 a0R table a0R + (a0LFeedback * kpeak0_0) + (a1 * kpeak1_0) + (a2 * kpeak2_0), 1, 1, 0, 1 a0L = a0L * kenv0 a0R = a0R * kenv0 aSigL = ((a0L * gkmix0) + (a1 * gkmix1) + (a2 * gkmix2)) * (iamp *.5) ;;; .5 b/c I've found it can get loud... aSigR = ((a0R * gkmix0) + (a1 * gkmix1) + (a2 * gkmix2)) * (iamp *.5) ;;; so I wanna give some headroom ;; update feedback if kenv0 < 0.005 then a0LFeedback = 0 else a0LFeedback = a0L endif if kenv1 < 0.005 then a1Feedback = 0 else a1Feedback = a1 endif if kenv2 < 0.005 then a2Feedback = 0 else a2Feedback = a2 endif ;; aFilterL bqrez aSigL, gkcutoff, gkreson aFilterR bqrez aSigR, gkcutoff, gkreson aFilterL balance aFilterL, aSigL aFilterR balance aFilterR, aSigR aL = aFilterL * .6 * ipanL aR = aFilterR * .6 * ipanR ;;denorm aL, aR gaL = gaL + aL gaR = gaR + aR outs aL, aR endin instr 99 aLrev, aRrev reverbsc gaL, gaR, gkreverb, gkfco, sr, .5, 1 outs aLrev*gkwetdry, aRrev*gkwetdry gaL = 0 gaR = 0 endin i99 0 9000 ;;; schhhtarttt the reverb!!! f 1 0 65537 10 1 ;;; sine wave, baby!!! ;;; TUNING TABLES FOR MICROTONES: ;;; normal 12-equal: f 100 0 64 -2 1 1.0594631 261 60 1.0 1.0594631 ;;; 1/5-comma meantone: f 101 0 64 -2 12 2.0 261 60 1.0 1.04945962689 1.11942341756 1.19405213835 1.2531095116 1.33664992545 1.40276013204 1.49627809191 1.57028344805 1.67496873525 1.78663405521 1.875 2.0 ;;; 13-edo: f 102 0 64 -2 1 1.0547661 261 60 1.0 1.0547661 ;;; 12 of 13-edo MOS: f 103 0 64 -2 12 2.0 261 60 1.0 1.05476607648 1.1125314761 1.17346046 1.23772628531 1.37700945119 1.45242285611 1.53196635734 1.61586614403 1.70436079286 1.79770194639 1.89615502868 2.0 ;;; CREATE YOUR OWN TUNING TABLES AND PUT THEM HERE: ;;; ;;; END TUNING TABLES f 0 10000 ;;; dummy score event plays for a long time