You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

613 lines
24KB

  1. <Cabbage>
  2. form caption("Bassline") size(615, 250), pluginID("basl")
  3. snapshot bounds( 80,185,200, 20), preset("bassline"), items("Preset 1", "Preset 2", "Preset 3", "Preset 4", "Preset 5", "Preset 6", "Preset 7", "Preset 8", "Preset 9", "Preset 10")
  4. image bounds( 0, 0,615,220), colour("grey"), shape("rounded"), outline("white"), line(4)
  5. checkbox bounds( 64, 8, 4, 4), channel("Act1"), value(0), colour("yellow"), shape("ellipse")
  6. checkbox bounds( 99, 8, 4, 4), channel("Act2"), value(0), colour("yellow"), shape("ellipse")
  7. checkbox bounds(134, 8, 4, 4), channel("Act3"), value(0), colour("yellow"), shape("ellipse")
  8. checkbox bounds(169, 8, 4, 4), channel("Act4"), value(0), colour("yellow"), shape("ellipse")
  9. checkbox bounds(204, 8, 4, 4), channel("Act5"), value(0), colour("yellow"), shape("ellipse")
  10. checkbox bounds(239, 8, 4, 4), channel("Act6"), value(0), colour("yellow"), shape("ellipse")
  11. checkbox bounds(274, 8, 4, 4), channel("Act7"), value(0), colour("yellow"), shape("ellipse")
  12. checkbox bounds(309, 8, 4, 4), channel("Act8"), value(0), colour("yellow"), shape("ellipse")
  13. checkbox bounds(344, 8, 4, 4), channel("Act9"), value(0), colour("yellow"), shape("ellipse")
  14. checkbox bounds(379, 8, 4, 4), channel("Act10"), value(0), colour("yellow"), shape("ellipse")
  15. checkbox bounds(414, 8, 4, 4), channel("Act11"), value(0), colour("yellow"), shape("ellipse")
  16. checkbox bounds(449, 8, 4, 4), channel("Act12"), value(0), colour("yellow"), shape("ellipse")
  17. checkbox bounds(484, 8, 4, 4), channel("Act13"), value(0), colour("yellow"), shape("ellipse")
  18. checkbox bounds(519, 8, 4, 4), channel("Act14"), value(0), colour("yellow"), shape("ellipse")
  19. checkbox bounds(554, 8, 4, 4), channel("Act15"), value(0), colour("yellow"), shape("ellipse")
  20. checkbox bounds(589, 8, 4, 4), channel("Act16"), value(0), colour("yellow"), shape("ellipse")
  21. label bounds( 10, 23, 40, 12), text("Note"), FontColour("black"), colour("black")
  22. rslider bounds( 45, 15, 45, 45), text("1"), FontColour("black"), channel("Note1"), range(24, 96, 60, 1, 1), preset("bassline")
  23. rslider bounds( 80, 15, 45, 45), text("2"), channel("Note2"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  24. rslider bounds(115, 15, 45, 45), text("3"), channel("Note3"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  25. rslider bounds(150, 15, 45, 45), text("4"), channel("Note4"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  26. rslider bounds(185, 15, 45, 45), text("5"), channel("Note5"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  27. rslider bounds(220, 15, 45, 45), text("6"), channel("Note6"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  28. rslider bounds(255, 15, 45, 45), text("7"), channel("Note7"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  29. rslider bounds(290, 15, 45, 45), text("8"), channel("Note8"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  30. rslider bounds(325, 15, 45, 45), text("9"), channel("Note9"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  31. rslider bounds(360, 15, 45, 45), text("10"), channel("Note10"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  32. rslider bounds(395, 15, 45, 45), text("11"), channel("Note11"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  33. rslider bounds(430, 15, 45, 45), text("12"), channel("Note12"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  34. rslider bounds(465, 15, 45, 45), text("13"), channel("Note13"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  35. rslider bounds(500, 15, 45, 45), text("14"), channel("Note14"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  36. rslider bounds(535, 15, 45, 45), text("15"), channel("Note15"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  37. rslider bounds(570, 15, 45, 45), text("16"), channel("Note16"), FontColour("black"), range(24, 96, 60, 1, 1), preset("bassline")
  38. label bounds( 10, 62, 40, 12), text("On/Off"), colour("black"), FontColour("black")
  39. checkbox bounds( 61, 62, 12, 12), channel("On1"), value(0), preset("bassline")
  40. checkbox bounds( 96, 62, 12, 12), channel("On2"), value(0), preset("bassline")
  41. checkbox bounds(131, 62, 12, 12), channel("On3"), value(0), preset("bassline")
  42. checkbox bounds(166, 62, 12, 12), channel("On4"), value(0), preset("bassline")
  43. checkbox bounds(201, 62, 12, 12), channel("On5"), value(0), preset("bassline")
  44. checkbox bounds(236, 62, 12, 12), channel("On6"), value(0), preset("bassline")
  45. checkbox bounds(271, 62, 12, 12), channel("On7"), value(0), preset("bassline")
  46. checkbox bounds(306, 62, 12, 12), channel("On8"), value(0), preset("bassline")
  47. checkbox bounds(341, 62, 12, 12), channel("On9"), value(0), preset("bassline")
  48. checkbox bounds(376, 62, 12, 12), channel("On10"), value(0), preset("bassline")
  49. checkbox bounds(411, 62, 12, 12), channel("On11"), value(0), preset("bassline")
  50. checkbox bounds(446, 62, 12, 12), channel("On12"), value(0), preset("bassline")
  51. checkbox bounds(481, 62, 12, 12), channel("On13"), value(0), preset("bassline")
  52. checkbox bounds(516, 62, 12, 12), channel("On14"), value(0), preset("bassline")
  53. checkbox bounds(551, 62, 12, 12), channel("On15"), value(0), preset("bassline")
  54. checkbox bounds(586, 62, 12, 12), channel("On16"), value(0), preset("bassline")
  55. label bounds( 11, 80, 40, 12), text("Hold"), colour("black"), FontColour("black")
  56. checkbox bounds( 61, 80, 12, 12), channel("Hold1"), value(0), preset("bassline")
  57. checkbox bounds( 96, 80, 12, 12), channel("Hold2"), value(0), preset("bassline")
  58. checkbox bounds(131, 80, 12, 12), channel("Hold3"), value(0), preset("bassline")
  59. checkbox bounds(166, 80, 12, 12), channel("Hold4"), value(0), preset("bassline")
  60. checkbox bounds(201, 80, 12, 12), channel("Hold5"), value(0), preset("bassline")
  61. checkbox bounds(236, 80, 12, 12), channel("Hold6"), value(0), preset("bassline")
  62. checkbox bounds(271, 80, 12, 12), channel("Hold7"), value(0), preset("bassline")
  63. checkbox bounds(306, 80, 12, 12), channel("Hold8"), value(0), preset("bassline")
  64. checkbox bounds(341, 80, 12, 12), channel("Hold9"), value(0), preset("bassline")
  65. checkbox bounds(376, 80, 12, 12), channel("Hold10"), value(0), preset("bassline")
  66. checkbox bounds(411, 80, 12, 12), channel("Hold11"), value(0), preset("bassline")
  67. checkbox bounds(446, 80, 12, 12), channel("Hold12"), value(0), preset("bassline")
  68. checkbox bounds(481, 80, 12, 12), channel("Hold13"), value(0), preset("bassline")
  69. checkbox bounds(516, 80, 12, 12), channel("Hold14"), value(0), preset("bassline")
  70. checkbox bounds(551, 80, 12, 12), channel("Hold15"), value(0), preset("bassline")
  71. checkbox bounds(586, 80, 12, 12), channel("Hold16"), value(0), preset("bassline")
  72. label bounds( 11, 98, 40, 12), text("Accent"), colour("black"), FontColour("black")
  73. checkbox bounds( 61, 98, 12, 12), channel("Acc1"), value(0), preset("bassline")
  74. checkbox bounds( 96, 98, 12, 12), channel("Acc2"), value(0), preset("bassline")
  75. checkbox bounds(131, 98, 12, 12), channel("Acc3"), value(0), preset("bassline")
  76. checkbox bounds(166, 98, 12, 12), channel("Acc4"), value(0), preset("bassline")
  77. checkbox bounds(201, 98, 12, 12), channel("Acc5"), value(0), preset("bassline")
  78. checkbox bounds(236, 98, 12, 12), channel("Acc6"), value(0), preset("bassline")
  79. checkbox bounds(271, 98, 12, 12), channel("Acc7"), value(0), preset("bassline")
  80. checkbox bounds(306, 98, 12, 12), channel("Acc8"), value(0), preset("bassline")
  81. checkbox bounds(341, 98, 12, 12), channel("Acc9"), value(0), preset("bassline")
  82. checkbox bounds(376, 98, 12, 12), channel("Acc10"), value(0), preset("bassline")
  83. checkbox bounds(411, 98, 12, 12), channel("Acc11"), value(0), preset("bassline")
  84. checkbox bounds(446, 98, 12, 12), channel("Acc12"), value(0), preset("bassline")
  85. checkbox bounds(481, 98, 12, 12), channel("Acc13"), value(0), preset("bassline")
  86. checkbox bounds(516, 98, 12, 12), channel("Acc14"), value(0), preset("bassline")
  87. checkbox bounds(551, 98, 12, 12), channel("Acc15"), value(0), preset("bassline")
  88. checkbox bounds(586, 98, 12, 12), channel("Acc16"), value(0), preset("bassline")
  89. button bounds( 10,120, 60, 25), colour("Green"), text("Stop", "Run"), channel("OnOff"), value(1)
  90. combobox bounds( 10,150, 60, 15), channel("Waveform"), value(1), text("saw","square","triangle","PWM","noise"), preset("bassline")
  91. rslider bounds( 20,170, 40, 40), text("P.W."), channel("pw"), range(0.01,0.99, 0.25), preset("bassline"), FontColour("black")
  92. rslider bounds( 70,120, 60, 60), text("Vol."), channel("Vol"), range(0, 5.00, 1), preset("bassline"), FontColour("black")
  93. rslider bounds(120,120, 60, 60), text("Cutoff"), channel("CfBase"), range(4.00, 14, 8), preset("bassline"), FontColour("black")
  94. rslider bounds(170,120, 60, 60), text("Env.Mod"), channel("CfEnv"), range(0, 10.00, 4), preset("bassline"), FontColour("black")
  95. rslider bounds(220,120, 60, 60), text("Res."), channel("Res"), range(0,0.98, .4), preset("bassline"), FontColour("black")
  96. rslider bounds(270,120, 60, 60), text("Dist."), channel("Dist"), range(0,1.00, 0), preset("bassline"), FontColour("black")
  97. rslider bounds(320,120, 60, 60), text("Decay"), channel("Decay"), range(0.10, 5, .3, 0.25), preset("bassline"), FontColour("black")
  98. rslider bounds(370,120, 60, 60), text("Accent"), channel("Accent"), range(0, 1.00, .5), preset("bassline"), FontColour("black")
  99. rslider bounds(420,120, 60, 60), text("Tempo"), channel("Tempo"), range(1, 500, 110, 1, 1), FontColour("black"), FontColour("black")
  100. button bounds(480,120, 60, 15), text("Reset"), channel("Reset"), value(0)
  101. button bounds(540,120, 60, 15), text("Random"), channel("Rnd"), value(0)
  102. button bounds(480,140, 60, 15), text("-semi"), channel("SemiDn"), value(0)
  103. button bounds(540,140, 60, 15), text("+semi"), channel("SemiUp"), value(0)
  104. button bounds(480,160, 60, 15), text("-oct"), channel("OctDn"), value(0)
  105. button bounds(540,160, 60, 15), text("+oct"), channel("OctUp"), value(0)
  106. button bounds(280, 185, 80, 20), text("External", "Internal"), channel("ClockSource"), value(0)
  107. label bounds(285, 205, 80, 12), text("Clock Source"), FontColour("black")
  108. image bounds(5, 225, 330, 20), colour(75, 85, 90, 100), plant("credit"){
  109. label bounds(0.03, 0.1, .6, .7), text("Author: Iain McCurdy |2012|"), colour("white")
  110. }
  111. hostbpm channel("bpm")
  112. </Cabbage>
  113. <CsoundSynthesizer>
  114. <CsOptions>
  115. -d -n
  116. </CsOptions>
  117. <CsInstruments>
  118. sr = 44100 ;SAMPLE RATE
  119. ksmps = 32 ;NUMBER OF AUDIO SAMPLES IN EACH CONTROL CYCLE
  120. nchnls = 2 ;NUMBER OF CHANNELS (2=STEREO)
  121. 0dbfs = 1
  122. seed 0
  123. ;Author: Iain McCurdy (2012)
  124. opcode moogladdersr,a,akk
  125. asig,kcf,kres xin
  126. setksmps 1
  127. acf interp kcf
  128. kcf downsamp acf
  129. asig moogladder asig, kcf, kres
  130. xout asig
  131. endop
  132. opcode resonsr,a,akki
  133. asig,kcf,kbw,iscal xin
  134. setksmps 1
  135. acf interp kcf
  136. kcf downsamp acf
  137. abw interp kbw
  138. kbw downsamp abw
  139. asig reson asig, kcf, kbw,iscal
  140. xout asig
  141. endop
  142. instr 1 ;BASSLINE INSTRUMENT
  143. kporttime linseg 0,0.001,0.01 ;PORTAMENTO TIME RAMPS UP QUICKLY FROM ZERO TO A HELD VALUE
  144. ;READ IN WIDGETS...
  145. gkOnOff chnget "OnOff"
  146. gkNote1 chnget "Note1"
  147. gkNote2 chnget "Note2"
  148. gkNote3 chnget "Note3"
  149. gkNote4 chnget "Note4"
  150. gkNote5 chnget "Note5"
  151. gkNote6 chnget "Note6"
  152. gkNote7 chnget "Note7"
  153. gkNote8 chnget "Note8"
  154. gkNote9 chnget "Note9"
  155. gkNote10 chnget "Note10"
  156. gkNote11 chnget "Note11"
  157. gkNote12 chnget "Note12"
  158. gkNote13 chnget "Note13"
  159. gkNote14 chnget "Note14"
  160. gkNote15 chnget "Note15"
  161. gkNote16 chnget "Note16"
  162. gkOn1 chnget "On1"
  163. gkOn2 chnget "On2"
  164. gkOn3 chnget "On3"
  165. gkOn4 chnget "On4"
  166. gkOn5 chnget "On5"
  167. gkOn6 chnget "On6"
  168. gkOn7 chnget "On7"
  169. gkOn8 chnget "On8"
  170. gkOn9 chnget "On9"
  171. gkOn10 chnget "On10"
  172. gkOn11 chnget "On11"
  173. gkOn12 chnget "On12"
  174. gkOn13 chnget "On13"
  175. gkOn14 chnget "On14"
  176. gkOn15 chnget "On15"
  177. gkOn16 chnget "On16"
  178. gkHold1 chnget "Hold1"
  179. gkHold2 chnget "Hold2"
  180. gkHold3 chnget "Hold3"
  181. gkHold4 chnget "Hold4"
  182. gkHold5 chnget "Hold5"
  183. gkHold6 chnget "Hold6"
  184. gkHold7 chnget "Hold7"
  185. gkHold8 chnget "Hold8"
  186. gkHold9 chnget "Hold9"
  187. gkHold10 chnget "Hold10"
  188. gkHold11 chnget "Hold11"
  189. gkHold12 chnget "Hold12"
  190. gkHold13 chnget "Hold13"
  191. gkHold14 chnget "Hold14"
  192. gkHold15 chnget "Hold15"
  193. gkHold16 chnget "Hold16"
  194. gkAcc1 chnget "Acc1"
  195. gkAcc2 chnget "Acc2"
  196. gkAcc3 chnget "Acc3"
  197. gkAcc4 chnget "Acc4"
  198. gkAcc5 chnget "Acc5"
  199. gkAcc6 chnget "Acc6"
  200. gkAcc7 chnget "Acc7"
  201. gkAcc8 chnget "Acc8"
  202. gkAcc9 chnget "Acc9"
  203. gkAcc10 chnget "Acc10"
  204. gkAcc11 chnget "Acc11"
  205. gkAcc12 chnget "Acc12"
  206. gkAcc13 chnget "Acc13"
  207. gkAcc14 chnget "Acc14"
  208. gkAcc15 chnget "Acc15"
  209. gkAcc16 chnget "Acc16"
  210. gkVol chnget "Vol"
  211. gkCfBase chnget "CfBase"
  212. gkCfBase portk gkCfBase,kporttime*5
  213. gkCfEnv chnget "CfEnv"
  214. gkCfEnv portk gkCfEnv,kporttime*5
  215. gkRes chnget "Res"
  216. gkDist chnget "Dist"
  217. gkDecay chnget "Decay"
  218. gkAccent chnget "Accent"
  219. gkWaveform chnget "Waveform"
  220. kpw chnget "pw"
  221. gkReset chnget "Reset"
  222. gkRnd chnget "Rnd"
  223. kSemiDn chnget "SemiDn"
  224. kSemiUp chnget "SemiUp"
  225. kOctDn chnget "OctDn"
  226. kOctUp chnget "OctUp"
  227. kClockSource chnget "ClockSource"
  228. if kClockSource==0 then
  229. gkTempo chnget "Tempo"
  230. else
  231. gkTempo chnget "bpm"
  232. gkTempo limit gkTempo,1,2000
  233. endif
  234. kNonActive init 0
  235. kStop trigger gkOnOff,0.5,1 ; IS LOOP PLAYING TURNED OFF...
  236. if kStop==1 then
  237. chnset kNonActive,"Act1"
  238. chnset kNonActive,"Act2"
  239. chnset kNonActive,"Act3"
  240. chnset kNonActive,"Act4"
  241. chnset kNonActive,"Act5"
  242. chnset kNonActive,"Act6"
  243. chnset kNonActive,"Act7"
  244. chnset kNonActive,"Act8"
  245. chnset kNonActive,"Act9"
  246. chnset kNonActive,"Act10"
  247. chnset kNonActive,"Act11"
  248. chnset kNonActive,"Act12"
  249. chnset kNonActive,"Act13"
  250. chnset kNonActive,"Act14"
  251. chnset kNonActive,"Act15"
  252. chnset kNonActive,"Act16"
  253. reinit RESET_LOOP
  254. endif
  255. RESET_LOOP:
  256. if gkOnOff==0 kgoto SKIP
  257. kPhFreq = gkTempo/240 ;FREQUENCY WITH WHICH TO REPEAT THE ENTIRE PHRASE
  258. kBtFreq = gkTempo/15 ;FREQUENCY OF EACH 1/16TH NOTE
  259. kNewNote metro kBtFreq ;GENERATES A TRIGGER FOR EACH BEAT
  260. ;ENVELOPES WITH HELD SEGMENTS
  261. ; freq trig ph NOTE:1 (dur) 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 DUMMY
  262. kNoteLoop lpshold kPhFreq, 0, 0, gkNote1, 1, gkNote2, 1, gkNote3, 1, gkNote4, 1, gkNote5, 1, gkNote6, 1, gkNote7, 1, gkNote8, 1, gkNote9, 1, gkNote10, 1, gkNote11, 1, gkNote12, 1, gkNote13, 1, gkNote4, 1, gkNote15, 1, gkNote16, 1 ;,gkNote1 ;NEED AN EXTRA 'DUMMY' VALUE
  263. kOn lpshold kPhFreq, 0, 0, gkOn1, 1, gkOn2, 1, gkOn3, 1, gkOn4, 1, gkOn5, 1, gkOn6, 1, gkOn7, 1, gkOn8, 1, gkOn9, 1, gkOn10, 1, gkOn11, 1, gkOn12, 1, gkOn13, 1, gkOn14, 1, gkOn15, 1, gkOn16, 1 ;,1 ;NEED AN EXTRA 'DUMMY' VALUE
  264. kAcc lpshold kPhFreq, 0, 0, gkAcc1, 1, gkAcc2, 1, gkAcc3, 1, gkAcc4, 1, gkAcc5, 1, gkAcc6, 1, gkAcc7, 1, gkAcc8, 1, gkAcc9, 1, gkAcc10, 1, gkAcc11, 1, gkAcc12, 1, gkAcc13, 1, gkAcc14, 1, gkAcc15, 1, gkAcc16, 1 ;,1 ;NEED AN EXTRA 'DUMMY' VALUE
  265. kHoldLoop lpshold kPhFreq, 0, 0, gkHold1, 1, gkHold2, 1, gkHold3, 1, gkHold4, 1, gkHold5, 1, gkHold6, 1, gkHold7, 1, gkHold8, 1, gkHold9, 1, gkHold10, 1, gkHold11, 1, gkHold12, 1, gkHold13, 1, gkHold14, 1, gkHold15, 1, gkHold16, 1 ;,0 ;NEED AN EXTRA 'DUMMY' VALUE
  266. kStep lpshold kPhFreq, 0, 0, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8, 1, 9, 1, 10, 1, 11, 1, 12, 1, 13, 1, 14, 1, 15, 1, 16, 1 ;,0 ;NEED AN EXTRA 'DUMMY' VALUE
  267. kNewOn trigger kOn,0.5,0 ;SENSE A NOTE ON FOLLOWING A NOTE OFF
  268. kAcc portk kAcc*gkAccent,kporttime ;SCALE ACCENT USING ON-SCREEN KNOB AND SMOOTH CHANGES IN ACCENT VALUE TO PREVENT CLICKS
  269. ;IGNORE PITCH VALUES AND HOLD VALUES FOR 'OFF' NOTES
  270. kNote init i(gkNote1)
  271. if kOn==1 then ;IF THIS IS AN 'ON' NOTE...
  272. kNote = kNoteLoop ;USE NOTE LOOP VALUE FOR PCH
  273. kHold = kHoldLoop ;USE HOLD LOOP VALUE FOR HOLD
  274. endif
  275. kHoldDel vdel_k kHold, 1/(kBtFreq*2), 1 ;OFFSET HOLD SO THAT ITS VALUE WILL OVERLAP THE NEXT NOTE
  276. kNote portk kNote, 0.01*kHoldDel*kOn ;APPLY PORTAMENTO TO PITCH CHANGES - IF NOTE IS NOT HELD, NO PORTAMENTO WILL BE APPLIED
  277. ;FILTER ENVELOPE
  278. kFiltRetrig = (1-kHoldDel) * kNewNote * kOn ; + kOnTrig
  279. ;CREATE A FILTER CUTOFF FREQUENCY ENVELOPE. FILTER ATTACK LEVEL IS A SUM OF BASE FREQUENCY, ENVELOPE DEPTH AND ACCENT
  280. ; freq trig ph v t v t v t(?)
  281. kCfOct loopseg 1/3600, kFiltRetrig+kNewOn, 0, gkCfBase+gkCfEnv+(kAcc*2), gkDecay, gkCfBase, 3600-gkDecay, gkCfBase, 0
  282. kCfOct limit kCfOct, 4, 14 ;LIMIT THE CUTOFF FREQUENCY TO BE WITHIN SENSIBLE LIMITS
  283. ;AMPLITUDE ENVELOPE - SEPARATES NOTES THAT ARE NOT HELD
  284. katt = 0.02 * (60/gkTempo)
  285. kdec = 0.02 * (60/gkTempo)
  286. ; freq trig ph v tim v t v t v t(?)
  287. kAmpEnv loopseg kBtFreq, 0, 0, 0, katt, 1, (1/kBtFreq)-katt-kdec, 1, kdec,0, 0 ;SUSTAIN SEGMENT DURATION (AND THEREFORE ATTACK AND DECAY SEGMENT DURATIONS) ARE DEPENDENT UPON TEMPO
  288. kAmp = (kHoldDel==1?1:kAmpEnv)
  289. ;AUDIO OSCILLATOR
  290. kWavTrig changed gkWaveform ;GENERATE A 'BANG' IF WAVEFORM SELECTOR CHANGES
  291. if kWavTrig=1 then ;IF A 'BANG' HAS BEEN GENERATED...
  292. reinit REINIT_VCO ;BEGIN A REINITIALIZATION PASS FROM THE LABEL 'REINIT_VCO'
  293. endif
  294. REINIT_VCO: ;A LABEL
  295. if i(gkWaveform)==1 then ;SAWTOOTH
  296. imode = 0
  297. elseif i(gkWaveform)==2 then ;SQUARE
  298. imode = 10
  299. elseif i(gkWaveform)==3 then ;TRIANGLE
  300. imode = 12
  301. elseif i(gkWaveform)==4 then ;PWM
  302. imode = 2
  303. elseif i(gkWaveform)==5 then ;NOISE
  304. anoise pinkish 1
  305. aSig resonsr anoise,cpsmidinn(kNote),cpsmidinn(kNote)*0.005,1
  306. aSig = aSig*20
  307. goto SKIP_VCO2
  308. endif
  309. kpw portk kpw,kporttime
  310. aSig vco2 0.2, cpsmidinn(kNote), imode, kpw ;GENERATE AUDIO USING VCO OSCILLATOR
  311. SKIP_VCO2:
  312. rireturn ;RETURN FROM INITIALIZATION PASS TO PERFORMANCE PASSES
  313. ;FILTER (CALLS UDO: A VERSION OF moogladder IN WHICH CUTOFF FREQUENCY IS MODULATED AT kr=sr) IN ORDER TO PREVENT QUANTISATION NOISE)
  314. kres limit gkRes+(kAcc*0.4),0,0.98 ;PREVENT EXCESSIVE RESONANCE THAT COULD RESULT FROM THE COMBINATION OF RESONANCE SETTING AND ACCENTING
  315. /*
  316. aFilt moogladdersr aSig, cpsoct(kCfOct), kres ;FILTER AUDIO
  317. aSig balance aFilt,aSig
  318. ;DISTORTION
  319. if gkDist==0 kgoto SKIP_DISTORTION
  320. iSclLimit ftgentmp 0, 0, 1024, -16, 1, 1024, -8, 0.01 ;RESCALING CURVE FOR CLIP 'LIMIT' PARAMETER
  321. iSclGain ftgentmp 0, 0, 1024, -16, 1, 1024, 4, 10 ;RESCALING CURVE FOR GAIN COMPENSATION
  322. kLimit table gkDist, iSclLimit, 1 ;READ LIMIT VALUE FROM RESCALING CURVE
  323. kGain table gkDist, iSclGain, 1 ;READ GAIN VALUE FROM RESCALING CURVE
  324. kTrigDist changed kLimit ;IF LIMIT VALUE CHANGES GENERATE A 'BANG'
  325. if kTrigDist=1 then ;IF A 'BANG' HAS BEEN GENERATED...
  326. reinit REINIT_CLIP ;BEGIN A REINITIALIZATION PASS FROM LABEL 'REINIT_CLIP'
  327. endif
  328. REINIT_CLIP:
  329. aSig clip aSig, 0, i(kLimit) ;CLIP DISTORT AUDIO SIGNAL
  330. rireturn ;
  331. aSig = aSig * kGain ;COMPENSATE FOR GAIN LOSS FROM 'CLIP' PROCESSING
  332. */
  333. iSclGain ftgentmp 0, 0, 1024, -16, 1, 1024, -6, 0.1 ;RESCALING CURVE FOR GAIN COMPENSATION
  334. kGain table gkDist, iSclGain, 1 ;READ GAIN VALUE FROM RESCALING CURVE
  335. aSig lpf18 aSig,cpsoct(kCfOct),kres, (gkDist^2)*20 ;LOWPASS
  336. ;aSig tone aSig,cpsoct(kCfOct)
  337. af1 resonz aSig,150,150,1
  338. aSig = aSig+af1
  339. aSig butlp aSig,4000
  340. aSig = aSig * kGain ;COMPENSATE FOR GAIN LOSS FROM 'CLIP' PROCESSING
  341. SKIP_DISTORTION:
  342. kOn port kOn, 0.006 ;SMOOTH CHANGES IN ON OFF SWITCHING
  343. aAmp interp kAmp*kOn*((kAcc*0.7)+1)*gkVol ;COMBINE ALL FACTORS THAT CONTRIBUTE TO AMPLITUDE AND INTERPOLATE AND CREATE AN A-RATE VERSION OF THIS RESULT (TO PREVENT QUANTISATION NOISE)
  344. aSig = aSig * aAmp ;SCALE AUDIO USING AMPLITUDE CONTROL FUNCTION
  345. outs aSig, aSig ;AUDIO SENT TO OUTPUT, APPLY AMP. ENVELOPE, VOLUME CONTROL AND NOTE ON/OFF STATUS
  346. rireturn
  347. SKIP:
  348. ;RESET SEQUENCE TO BLANK
  349. ktrig changed gkReset
  350. if ktrig==1 then
  351. kval = 60
  352. chnset kval,"Note1"
  353. chnset kval,"Note2"
  354. chnset kval,"Note3"
  355. chnset kval,"Note4"
  356. chnset kval,"Note5"
  357. chnset kval,"Note6"
  358. chnset kval,"Note7"
  359. chnset kval,"Note8"
  360. chnset kval,"Note9"
  361. chnset kval,"Note10"
  362. chnset kval,"Note11"
  363. chnset kval,"Note12"
  364. chnset kval,"Note13"
  365. chnset kval,"Note14"
  366. chnset kval,"Note15"
  367. chnset kval,"Note16"
  368. kval = 0
  369. chnset kval,"On1"
  370. chnset kval,"On2"
  371. chnset kval,"On3"
  372. chnset kval,"On4"
  373. chnset kval,"On5"
  374. chnset kval,"On6"
  375. chnset kval,"On7"
  376. chnset kval,"On8"
  377. chnset kval,"On9"
  378. chnset kval,"On10"
  379. chnset kval,"On11"
  380. chnset kval,"On12"
  381. chnset kval,"On13"
  382. chnset kval,"On14"
  383. chnset kval,"On15"
  384. chnset kval,"On16"
  385. chnset kval,"Hold1"
  386. chnset kval,"Hold2"
  387. chnset kval,"Hold3"
  388. chnset kval,"Hold4"
  389. chnset kval,"Hold5"
  390. chnset kval,"Hold6"
  391. chnset kval,"Hold7"
  392. chnset kval,"Hold8"
  393. chnset kval,"Hold9"
  394. chnset kval,"Hold10"
  395. chnset kval,"Hold11"
  396. chnset kval,"Hold12"
  397. chnset kval,"Hold13"
  398. chnset kval,"Hold14"
  399. chnset kval,"Hold15"
  400. chnset kval,"Hold16"
  401. chnset kval,"Acc1"
  402. chnset kval,"Acc2"
  403. chnset kval,"Acc3"
  404. chnset kval,"Acc4"
  405. chnset kval,"Acc5"
  406. chnset kval,"Acc6"
  407. chnset kval,"Acc7"
  408. chnset kval,"Acc8"
  409. chnset kval,"Acc9"
  410. chnset kval,"Acc10"
  411. chnset kval,"Acc11"
  412. chnset kval,"Acc12"
  413. chnset kval,"Acc13"
  414. chnset kval,"Acc14"
  415. chnset kval,"Acc15"
  416. chnset kval,"Acc16"
  417. endif
  418. ;RANDOMISE SEQUENCE
  419. ktrig changed gkRnd
  420. if ktrig==1 then
  421. #define RANDOM_STEP(N)
  422. #
  423. kval random 48,72.999
  424. chnset int(kval),"Note$N"
  425. kval random 0,1.999
  426. chnset int(kval),"On$N"
  427. kval random 0,1.999
  428. chnset int(kval),"Hold$N"
  429. kval random 0,1.999
  430. chnset int(kval),"Acc$N"
  431. #
  432. $RANDOM_STEP(1)
  433. $RANDOM_STEP(2)
  434. $RANDOM_STEP(3)
  435. $RANDOM_STEP(4)
  436. $RANDOM_STEP(5)
  437. $RANDOM_STEP(6)
  438. $RANDOM_STEP(7)
  439. $RANDOM_STEP(8)
  440. $RANDOM_STEP(9)
  441. $RANDOM_STEP(10)
  442. $RANDOM_STEP(11)
  443. $RANDOM_STEP(12)
  444. $RANDOM_STEP(13)
  445. $RANDOM_STEP(14)
  446. $RANDOM_STEP(15)
  447. $RANDOM_STEP(16)
  448. endif
  449. ;PROGRESS INDICATORS
  450. kStepChange changed kStep
  451. kActive = 1
  452. kNonActive = 0
  453. if kStepChange==1 then
  454. if kStep==1 then
  455. chnset kActive,"Act1"
  456. chnset kNonActive,"Act16"
  457. elseif kStep==2 then
  458. chnset kActive,"Act2"
  459. chnset kNonActive,"Act1"
  460. elseif kStep==3 then
  461. chnset kActive,"Act3"
  462. chnset kNonActive,"Act2"
  463. elseif kStep==4 then
  464. chnset kActive,"Act4"
  465. chnset kNonActive,"Act3"
  466. elseif kStep==5 then
  467. chnset kActive,"Act5"
  468. chnset kNonActive,"Act4"
  469. elseif kStep==6 then
  470. chnset kActive,"Act6"
  471. chnset kNonActive,"Act5"
  472. elseif kStep==7 then
  473. chnset kActive,"Act7"
  474. chnset kNonActive,"Act6"
  475. elseif kStep==8 then
  476. chnset kActive,"Act8"
  477. chnset kNonActive,"Act7"
  478. elseif kStep==9 then
  479. chnset kActive,"Act9"
  480. chnset kNonActive,"Act8"
  481. elseif kStep==10 then
  482. chnset kActive,"Act10"
  483. chnset kNonActive,"Act9"
  484. elseif kStep==11 then
  485. chnset kActive,"Act11"
  486. chnset kNonActive,"Act10"
  487. elseif kStep==12 then
  488. chnset kActive,"Act12"
  489. chnset kNonActive,"Act11"
  490. elseif kStep==13 then
  491. chnset kActive,"Act13"
  492. chnset kNonActive,"Act12"
  493. elseif kStep==14 then
  494. chnset kActive,"Act14"
  495. chnset kNonActive,"Act13"
  496. elseif kStep==15 then
  497. chnset kActive,"Act15"
  498. chnset kNonActive,"Act14"
  499. elseif kStep==16 then
  500. chnset kActive,"Act16"
  501. chnset kNonActive,"Act15"
  502. endif
  503. endif
  504. ;TRANSPOSE
  505. ktrig1 changed kSemiDn
  506. ktrig2 changed kSemiUp
  507. ktrig3 changed kOctDn
  508. ktrig4 changed kOctUp
  509. if ktrig1+ktrig2+ktrig3+ktrig4==1 then
  510. #define TRANSPOSE(N)
  511. #
  512. kval limit gkNote$N+kInt,24,96
  513. chnset kval,"Note$N"
  514. #
  515. if ktrig1==1 then
  516. kInt = -1
  517. elseif ktrig2==1 then
  518. kInt = 1
  519. elseif ktrig3==1 then
  520. kInt = -12
  521. elseif ktrig4==1 then
  522. kInt = 12
  523. endif
  524. $TRANSPOSE(1)
  525. $TRANSPOSE(2)
  526. $TRANSPOSE(3)
  527. $TRANSPOSE(4)
  528. $TRANSPOSE(5)
  529. $TRANSPOSE(6)
  530. $TRANSPOSE(7)
  531. $TRANSPOSE(8)
  532. $TRANSPOSE(9)
  533. $TRANSPOSE(10)
  534. $TRANSPOSE(11)
  535. $TRANSPOSE(12)
  536. $TRANSPOSE(13)
  537. $TRANSPOSE(14)
  538. $TRANSPOSE(15)
  539. $TRANSPOSE(16)
  540. endif
  541. endin
  542. </CsInstruments>
  543. <CsScore>
  544. i 1 0 [3600*24*7]
  545. </CsScore>
  546. </CsoundSynthesizer>