home *** CD-ROM | disk | FTP | other *** search
/ PC Musician 2000 / PC_Musician_2000.iso / PCMUSIC / MISC / SYSXMAN1 / GENMIDI.SON < prev    next >
Encoding:
Text File  |  1995-10-31  |  13.0 KB  |  437 lines

  1. #include sonc.h
  2. #include effects.h
  3.  
  4. #defblock midi_inst(sfile, srate, spitch, channels, progs, notes, rept)
  5. midivoice(channels,progs,notes) {
  6.     vel = midi(NOTE_ON_VEL, midi(NOTE_OFF_VEL, midi(CHNL_PRES)));
  7.     mod = midi(NOTE_ON_PITCH, pitch(srate, spitch))
  8.           * (midi(PITCH_BEND)*(0.1225*4)+1); /* two semitones */
  9.     sampl = midi(NOTE_OFF_RESET, midi(NOTE_ON_RESET,
  10.           sample(sfile, mod, 1, 1)))[1];
  11.         out = sampl*vel;
  12.         ladd = ladd + out;
  13.         radd = radd + out*REVBADD
  14. }
  15. #enddef
  16. #defblock midi_perc_inst(sfile, srate, spitch, channels, progs, notes, rept)
  17. midivoice(channels,progs,notes) {
  18.         vel = midi(NOTE_ON_VEL, midi(CHNL_PRES));
  19.     mod = midi(NOTE_ON_PITCH, pitch(srate, spitch));
  20.         sampl = midi(NOTE_ON_RESET, sample(sfile, mod, 1, 1))[1];
  21.         out = sampl*vel;
  22.         ladd = ladd + out;
  23.         radd = radd + out*REVBADD
  24. }
  25. #enddef
  26. #defblock midi_inst_decay(sfile, srate, spitch, channels, progs, notes, decaytime)
  27. midivoice(channels,progs,notes) {
  28.     vel = midi(NOTE_ON_VEL, midi(NOTE_OFF_VEL));
  29.         firstvel = midi(NOTE_ON_VEL);
  30.     mod = midi(NOTE_ON_PITCH, pitch(srate, spitch));
  31.     sampl = midi(NOTE_ON_RESET,
  32.           sample(sfile, mod, 1, 1))[1];
  33.         decaysampl = midi(NOTE_OFF_DECAY_RESET,
  34.             sample("decay.dat", pitch(2048/decaytime), 1, 1))[1];
  35.         out = sampl*(vel+firstvel*decaysampl);
  36.         ladd = ladd + out;
  37.         radd = radd + out*REVBADD
  38. }
  39. #enddef
  40. #defblock midi_perc(sfile, srate, notes, rept)
  41. midivoice(perchan,[0:127],notes) {
  42.     vel = midi(NOTE_ON_VEL, midi(CHNL_PRES));
  43.     mod = pitch(srate);
  44.     sampl = midi(NOTE_ON_RESET, sample(sfile, mod, 1, 1))[1];
  45.         out = sampl*vel;
  46.         ladd = ladd + out;
  47.         radd = radd + out*REVBADD
  48. }
  49. #enddef
  50. #defblock midi_chorus(sfile, srate, spitch, channels, progs, notes, rept)
  51. midivoice(channels,progs,notes) {
  52.     vel = midi(NOTE_ON_VEL, midi(NOTE_OFF_VEL, midi(CHNL_PRES)));
  53. //    vel = average(vel, 64);
  54.     sampl = 0;
  55.     mod = midi(NOTE_ON_PITCH, pitch(srate, spitch));
  56.     sampl = sampl + delay(midi(NOTE_ON_RESET, sample(sfile, mod, 1, 1))[1], 0.01);
  57.     mod = midi(NOTE_ON_PITCH, pitch(srate*1.004, spitch));
  58.     sampl = sampl + delay(midi(NOTE_ON_RESET, sample(sfile, mod, 1, 1))[1], 0.03);
  59.     mod = midi(NOTE_ON_PITCH, pitch(srate*0.99, spitch));
  60.     sampl = sampl + delay(midi(NOTE_ON_RESET, sample(sfile, mod, 1, 1))[1], 0.047);
  61.     mod = midi(NOTE_ON_PITCH, pitch(srate*1.009, spitch));
  62.     sampl = sampl + delay(midi(NOTE_ON_RESET, sample(sfile, mod, 1, 1))[1], 0.038);
  63.         out = sampl*vel*0.25;
  64.         ladd = ladd + out;
  65.         radd = radd + out
  66. }
  67. #enddef
  68.  
  69. {
  70. ladd = 0;
  71. radd = 0;
  72. lsub = 0;
  73. rsub = 0;
  74.  
  75. /**************************************************************************
  76.  
  77. General MIDI Specification
  78.  
  79. The following table lists the names of each of the General MIDI patch numbers.  
  80. This mapping is assumed for all events on all channels other than channel 10.  
  81. Channel 10 is reserved for the drum track.  Note that similar instruments are 
  82. grouped together.
  83.  
  84. NOTE: You must use (patch# - 1) in Sonitica.
  85.  
  86. General MIDI Patch Map
  87.  
  88. #    Piano            #    Chromatic Percussion
  89.  
  90. 1    Acoustic Grand Piano    9    Celesta
  91. 2    Bright Acoustic Piano    10    Glockenspiel
  92. 3    Electric Grand Piano    11    Music Box
  93. 4    Honky-Tonk Piano    12    Vibraphone
  94. 5    Rhodes Piano        13    Marimba
  95. 6    Chorused Piano        14    Xylophone
  96. 7    Harpsichord        15    Tubular Bells
  97. 8    Clavinet        16    Dulcimer
  98.  
  99. #    Organ            #    Guitar
  100.  
  101. 17    Hammond Organ         25    Acoustic Guitar (nylon)
  102. 18    Percussive Organ    26    Acoustic Guitar (steel)
  103. 19    Rock Organ        27    Electric Guitar (jazz)
  104. 20    Church Organ        28    Electric Guitar (clean)
  105. 21    Reed Organ        29    Electric Guitar (muted)
  106. 22    Accordion        30    Overdriven Guitar
  107. 23    Harmonica         31    Distortion Guitar
  108. 24    Tango Accordion     32    Guitar Harmonics
  109.  
  110. #    Bass            #    Strings
  111.  
  112. 33    Acoustic Bass        41    Violin
  113. 34    Electric Bass (finger)    42    Viola
  114. 35    Electric Bass (pick)    43    Cello
  115. 36    Fretless Bass        44    Contrabass
  116. 37    Slap Bass 1        45    Tremolo Strings
  117. 38    Slap Bass 2        46    Pizzicato Strings
  118. 39    Synth Bass 1        47    Orchestral Harp
  119. 40    Synth Bass 2        48    Timpani
  120.  
  121. #    Ensemble        #    Brass
  122.  
  123. 49    String Ensemble 1    57    Trumpet
  124. 50    String Ensemble 2    58    Trombone
  125. 51    SynthStrings 1        59    Tuba
  126. 52    SynthStrings 2        60    Muted Trumpet
  127. 53    Choir Aahs        61    French Horn
  128. 54    Voice Oohs        62    Brass Section
  129. 55    Synth Voice        63    Synth Brass 1
  130. 56    Orchestra Hit        64    Synth Brass 2
  131.  
  132. #    Reed        #    Pipe
  133.  
  134. 65    Soprano Sax    73    Piccolo
  135. 66    Alto Sax     74    Flute
  136. 67    Tenor Sax    75    Recorder
  137. 68    Baritone Sax    76    Pan Flute
  138. 69    Oboe        77    Blown Bottle
  139. 70    English Horn    78    Skakuhachi
  140. 71    Bassoon        79    Whistle
  141. 72    Clarinet    80    Ocarina
  142.  
  143. #    Synth Lead        #    Synth Pad
  144.  
  145. 81    Lead 1 (square)        89    Pad 1 (new age)
  146. 82    Lead 2 (sawtooth)    90    Pad 2 (warm)
  147. 83    Lead 3 (calliope lead)    91    Pad 3 (polysynth)
  148. 84    Lead 4 (chiff lead)    92    Pad 4 (choir)
  149. 85    Lead 5 (charang)    93    Pad 5 (bowed)
  150. 86    Lead 6 (voice)        94    Pad 6 (metallic)
  151. 87    Lead 7 (fifths)        95    Pad 7 (halo)
  152. 88    Lead 8 (brass + lead)    96    Pad 8 (sweep)
  153.  
  154. #    Synth Effects        #    Ethnic
  155.  
  156. 97    FX 1 (rain)        105    Sitar
  157. 98    FX 2 (soundtrack)    106    Banjo
  158. 99    FX 3 (crystal)        107    Shamisen
  159. 100    FX 4 (atmosphere)    108    Koto
  160. 101    FX 5 (brightness)    109    Kalimba
  161. 102    FX 6 (goblins)        110    Bagpipe
  162. 103    FX 7 (echoes)        111    Fiddle
  163. 104    FX 8 (sci-fi)        112    Shanai
  164.  
  165. #    Percussive    #    Sound Effects
  166.  
  167. 113    Tinkle Bell    121    Guitar Fret Noise
  168. 114    Agogo         122    Breath Noise
  169. 115    Steel Drums    123    Seashore
  170. 116    Woodblock    124    Bird Tweet
  171. 117    Taiko Drum    125    Telephone Ring
  172. 118    Melodic Tom    126    Helicopter
  173. 119    Synth Drum    127    Applause
  174. 120    Reverse Cymbal    128    Gunshot
  175.  
  176. ***************************************************************************/
  177.  
  178. #define stdchan [0:8,10:15]
  179. #define perchan [9]
  180. #define unsigned 1
  181.  
  182. #define NOTE_C2 128
  183.  
  184. #define REVBADD 1
  185. // piano
  186. #define DECAY 2.5
  187. #repeat 5
  188. midi_inst_decay("a01-c1.wav", 22050, NOTE_C2/2, stdchan, [0:3], [0:35], DECAY);
  189. midi_inst_decay("a01-c2.wav", 22050, NOTE_C2, stdchan, [0:3], [36:47], DECAY/2);
  190. midi_inst_decay("a01-c3.wav", 22050, NOTE_C2*2, stdchan, [0:3], [48:59], DECAY/3);
  191. midi_inst_decay("a01-c4.wav", 22050, NOTE_C2*4, stdchan, [0:3], [60:127], DECAY/4);
  192. #enddef
  193. // organ
  194. #repeat 5
  195. midi_inst("skporg.wav", 22050, 440, stdchan, [16:23], [0:127], 6);
  196. #enddef
  197. // harpscifunk
  198. #repeat 3
  199. midi_inst("harpfunk.wav", 22050, NOTE_C2, stdchan, [6:7], [0:127], 4);
  200. #enddef
  201. // piano, organ are loud for pop
  202. #ifdef POPPED
  203. ladd = ladd /2;
  204. radd = radd /2;
  205. #endif
  206. #repeat 3
  207. midi_inst("sing1.wav", 22050, NOTE_C2*2, stdchan, [54,85,90,94,99,101], [0:127], 4);
  208. #enddef
  209. #repeat 3
  210. midi_inst("chorlo.wav", 11025, 212.5, stdchan, [52,53,91,88], [0:59], 4);
  211. midi_inst("chorhi.wav", 15000, 212.5*2, stdchan, [52,53,91,88], [60:127], 4);
  212. #enddef
  213. #define REVBADD 0
  214. // chorus piano
  215. #repeat 3
  216. out = 0;
  217. midi_inst("a03-c2.wav", 22050, NOTE_C2, stdchan, [4:5], [0:35], 4);
  218. lsub = lsub - out;
  219. out = 0;
  220. midi_inst("a03-c4.wav", 22050, NOTE_C2*4, stdchan, [4:5], [36:127], 4);
  221. lsub = lsub - out;
  222. #enddef
  223.  
  224. #define REVBADD 1
  225. #repeat 5
  226. midi_inst("skviollo.wav", 22050, 440, stdchan, [40:44,48,49,50,51], [0:127], 6);
  227. //midi_inst("skviolhi.wav", 22050, 880, stdchan, [40,49,51], [0:127], 6);
  228. midi_inst("skclarin.wav", 22050, 880, stdchan, [71:79], [0:127], 4);
  229. midi_inst("skporg.wav", 22050, 440, stdchan, [16:23], [0:127], 6);
  230. midi_inst("skoboe.wav", 22050, 880, stdchan, [68,111], [0:127], 2);
  231. midi_inst("sktrumpt.wav", 22050, 440, stdchan, [56:59,61:67], [0:127], 6);
  232. midi_inst("skpiano.wav", 22050, 220, stdchan, [46,105:108], [0:127], 4);
  233. midi_inst("skabass.wav", 22050, 220, stdchan, [8,45,31,32,37], [0:127], 8);
  234. midi_inst("skfrhorn.wav", 22050, 440, stdchan, [60,69], [0:127], 4);
  235. midi_inst("marimba.nti", 8000, 440, stdchan, [8:15], [0:127], 2);
  236. #enddef
  237. #repeat 3
  238. midi_inst("timpani.nti", 22050, 130.812, stdchan, [47], [0:127], 2);
  239. midi_inst("skabass.wav", 22050, 220, stdchan, [32], [0:127], 2); // should be 110?
  240. #enddef
  241. //
  242. // distortion guitar
  243. //
  244. laddold = ladd;
  245. ladd = 0;
  246. #repeat 6
  247. midi_inst("egtr-a3.wav", 22050, 215/2, stdchan, [29], [0:127], 8);
  248. #enddef
  249. ladd = transform(ladd/256, "LOGTBL", 14);
  250. lsub = lsub + ladd/2;
  251. ladd = laddold + (ladd + delay(ladd, 0.03));
  252.  
  253. laddold = ladd;
  254. ladd = 0;
  255. #repeat 6
  256. midi_inst("egtr-a5.wav", 22050, 215*2, stdchan, [30], [0:127], 8);
  257. #enddef
  258. ladd = transform(ladd/32, "LOGTBL", 14);
  259. rsub = rsub + ladd/2;
  260. ladd = laddold + ladd;
  261.  
  262. //
  263. // guitars -- w/ a little chorus
  264. //
  265. laddold = ladd;
  266. ladd = 0;
  267. #repeat 4
  268. midi_inst("egtr-a3.wav", 22050, 215/2, stdchan, [24:28], [0:59], 8);
  269. midi_inst("egtr-a5.wav", 22050, 215*2, stdchan, [24:28], [60:127], 8);
  270. #enddef
  271. schorus(ladd, lchor, rchor, 0.005, 0.01, 0.5, 0.2);
  272. lsub = lsub - lchor;
  273. rsub = rsub - rchor;
  274. ladd = laddold;
  275.  
  276. #define REVBADD 0
  277. #repeat 2
  278. // picked bass
  279. out = 0;
  280. midi_inst("gtrpluk8.wav", 11025, 53, stdchan, [34], [0:127], 2);
  281. ladd = ladd + out;    // make it 2x louder!
  282. // fingered bass
  283. midi_inst("pbass.nti", 15000, 61.7534, stdchan, [33,35,36,37], [0:127], 2);
  284. // synth bass 1
  285. midi_inst("funbass.nti", 16800, 130.812, stdchan, [38], [0:127], 2);
  286. // synth bass 2
  287. midi_inst("moogbass.nti", 16800, 130.812, stdchan, [39], [0:127], 2);
  288. #enddef
  289. #repeat 4
  290. out = 0;
  291. // all-purpose synth
  292. midi_inst("synth5.nti", 8400, 130.812*2, stdchan, [80:87], [0:127], 2);
  293. //midi_inst("synthc5.wav", 11025, 130.812*4, stdchan, [80:87], [0:127], 2);
  294. rsub = rsub - out;
  295. #enddef
  296.  
  297. #define REVBADD 1
  298. // orchestral hit
  299. midi_inst("hitme2.nti", 16800, 130.812*2, stdchan, [55], [0:127], 2);
  300.  
  301. /*********************************************************************
  302.  
  303. General MIDI Percussion Key Map
  304. The following table shows the sound assigned to each MIDI note on channel 10.
  305.  
  306. #    Drum Sound    #    Drum Sound
  307.  
  308. 35    Acoustic Bass Drum    59    Ride Cymbal 2
  309. 36 c3   Bass Drum 1     60 c5   Hi Bongo
  310. 37    Side Stick    61    Low Bongo
  311. 38    Acoustic Snare    62    Mute Hi Conga
  312. 39    Hand Clap    63    Open Hi Conga
  313. 40    Electric Snare     64    Low Conga
  314. 41    Low Floor Tom    65    High Timbale
  315. 42    Closed Hi-Hat    66    Low Timbale
  316. 43    High Floor Tom    67 g5    High Agogo
  317. 44    Pedal Hi-Hat    68    Low Agogo
  318. 45    Low Tom      69    Cabasa
  319. 46    Open Hi-Hat    70    Maracas
  320. 47    Low-Mid Tom    71    Short Whistle
  321. 48 c4    Hi-Mid Tom     72 c6   Long Whistle
  322. 49    Crash Cymbal 1    73    Short Guiro
  323. 50    High Tom    74    Long Guiro
  324. 51    Ride Cymbal 1    75    Claves
  325. 52    Chinese Cymbal    76    Hi Wood Block
  326. 53    Ride Bell    77    Low Wood Block
  327.  
  328. 54    Tambourine    78    Mute Cuica
  329. 55    Splash Cymbal     79    Open Cuica
  330. 56    Cowbell    80    Mute Triangle
  331. 57    Crash Cymbal 2     81    Open Triangle
  332. 58    Vibraslap
  333.  
  334. **********************************************************************/
  335.  
  336. #define REVBADD 1
  337. #repeat 2
  338. midi_perc("edlsnar2.nti", 15000, [38,40], 2);
  339. out = 0;
  340. midi_perc("yride.nti", 22050, [51,53,59], 1);
  341. rsub = rsub - out;
  342. //midi_perc("orchcrsh.wav", 44100, [49], 2);
  343. midi_perc("crashsk.nti", 22050, [49,55,57,58], 2);
  344. midi_perc("claps.wav", 22050, [39], 1);
  345. out = 0;
  346. midi_perc("tambouri.wav", 22050, [54], 1);
  347. lsub = lsub - out;
  348. midi_perc("chinaboy.wav", 22050, [52], 1);
  349. midi_perc_inst("tomtom.nti", 15000, 220, perchan, [0:127], [41,43,45,47,48,50], 3);
  350. midi_perc("sidestik.wav", 22050, [37], 1);
  351. midi_perc("woodblk.wav", 11025*3/2, [76], 1);
  352. midi_perc("woodblk.wav", 11025, [77], 1);
  353. #enddef
  354. #define REVBADD 0
  355. #repeat 2
  356. midi_perc("thikbass.nti", 15000, [35,36], 2);
  357. midi_perc("tighthh.wav", 44100, [42], 1);    // closed hh
  358. midi_perc("closedhh.wav", 44100, [44], 1);    // pedal hh
  359. midi_perc("pedalhh.wav", 22050, [46], 1);    // open hh
  360. out = 0;
  361. midi_perc("cowbell.nti", 15000, [56,67,68], 1);
  362. rsub = rsub - out;
  363. midi_perc("timbalo.wav", 11025, [66], 1);
  364. midi_perc("timbahi.wav", 11025, [65], 1);
  365. midi_perc("opconga.wav", 11025*2, [63], 1);
  366. midi_perc("opconga.wav", 11025, [64], 1);
  367. midi_perc("mutconga.wav", 11025, [62], 1);
  368. midi_perc("agogo.wav", 11025, [68], 1);
  369. midi_perc("agogo.wav", 11025*2, [67], 1);
  370. out = 0;
  371. midi_perc("casaba.wav", 22050, [69], 1);
  372. lsub = lsub - out/2;
  373. out = 0;
  374. midi_perc("maracas.wav", 11025, [70], 1);
  375. lsub = lsub - out/2;
  376. #enddef
  377.  
  378. /*
  379. #repeat 12
  380. midivoice(stdchan,[16,0:127],[0:127]) {
  381.     vel = forward vel*0.9997;
  382.     midi(NOTE_ON_VEL, midi(NOTE_OFF_VEL, midi(CHNL_PRES, vel)));
  383.     mod = midi(NOTE_ON_PITCH, delta);
  384.     sampl = wavegen(TRIANGLE, mod);
  385.     out = sampl*vel;
  386.     ladd = ladd + out;
  387.     radd = radd + out
  388. };
  389. #enddef
  390. */
  391.  
  392. rvbadd = radd;
  393.  
  394. #ifdef POP
  395. #define RVBSCAL 90
  396. #define RVBTIME 0.2417
  397. #define RVBFEED 0.95
  398. ladd = ladd - radd / 4;        // make non-reverb inst's louder
  399. radd = ladd;
  400. #else
  401. #define RVBSCAL 60
  402. #define RVBTIME 0.3817
  403. #define chormix 0.25
  404. #define RVBFEED 0.97
  405. ladd = chorus(ladd, 0.005, 0.01, chormix, 0.2);
  406. radd = chorus(ladd, 0.005, 0.01, chormix, 0.25);
  407. #endif
  408.  
  409. #ifndef NOREVERB
  410. sreverb(rvbadd, lrvb, rrvb, RVBTIME, 0.97, 0);
  411. //hallreverb(rvbadd, lrvb, rrvb);
  412. #else
  413. lrvb = 0;
  414. rrvb = 0;
  415. #endif
  416.  
  417. #ifdef JUSTREVERB
  418. ladd = 0; radd = 0;
  419. #else
  420. ladd = ladd - lsub;
  421. radd = radd - rsub;
  422. #endif
  423.  
  424. #define OUTFREQ 22050
  425. #ifdef FREQ
  426. #define OUTFREQ FREQ
  427. #endif
  428.  
  429. #ifdef OUTFILENAME
  430. outfile(OUTFILENAME, OUTFREQ, 2, 2, ladd/8+lrvb/RVBSCAL, radd/8+rrvb/RVBSCAL)
  431. #else
  432. outdevice(0, OUTFREQ, 2, 2, ladd/8+lrvb/RVBSCAL, radd/8+rrvb/RVBSCAL)
  433. #endif
  434. //outdevice(2, OUTFREQ, 1, 1, (ladd+radd)/16+lrvb/RVBSCAL)
  435. //outfile("test.snd", 22050, 2, 2, ladd/8+lrvb/RVBSCAL, radd/8+rrvb/RVBSCAL)
  436. }
  437.