; DRUMSPLT.CAL ; ; by Philippe LEMAIRE ; ; This routine modifies a source track, splitting it by note# into ; separate destination tracks. Only notes are split ... all other ; track parameters (Controllers, Tempos, Meters and Markers), ; if any, remain in the source track. ; ; Use this routine for splitting up a drum machine ; (here WaveBlaster Std Drums). ; ; based on SPLITNOT.CAL by ; Red Nile Productions 1993 (714)498-7515 CIS:70044,2733 ; Will be faster if Logical function were there ! ; ; Assume that the destination trackes are empty ! (do ; (include "need20.cal") ; Require version 2.0 or higher of CAL (string a) (int nSrcTrk) (int nDestTrk) (int nDestChan 10) (int nDestPort 1) (dword oFrom From) (dword oThru Thru) (int p) (int o -1) (dword l) (int n) (int i) (int f) (word b) (word t) (word m) (word n0 0) (word n1 0) (word n2 0) (word n3 0) (word n4 0) (word n5 0) (word n6 0) (word n7 0) (= nSrcTrk (+ 1 (GetCurrentTrack))) (getInt nSrcTrk " Source Track? " 1 256) (= nDestTrk (+ 2 nSrcTrk)) (-- nSrcTrk) ; CAL uses 0..255 (getInt nDestTrk "First Destination Track?" 1 256) (-- nDestTrk) ; CAL uses 0..255 (getInt nDestChan "Destination Channel?" 0 16) (-- nDestChan) ; CAL uses -1..15 (getInt nDestPort "Destination Port?" 1 16) (-- nDestPort) ; 0 .. 15 ; If markers not set, select entire range (if (== From Thru) (do (= From 0) (= Thru End) ) ) (= l (- Thru From)) ; Select only source track (TrackSelect 0 -1) (SetCurrentTrack nSrcTrk) (ResetFilter 0 TRUE) (SetFilterKind 0 NOTE TRUE) (SetFilterKind 0 KEYAFT FALSE) (SetFilterKind 0 CONTROL FALSE) (SetFilterKind 0 PATCH FALSE) (SetFilterKind 0 CHANAFT FALSE) (SetFilterKind 0 WHEEL FALSE) (forEachEvent (if (== Event.Kind NOTE) (do (= p (/ (* 100 (- Event.Time From)) l)) (if (!= p o) (do (message " Scanning : " p "%% done !") (= o p) ) ) (= i (/ Note.Key 16)) (= f (- Note.Key (* i 16))) (switch f 0 (= m 1) 1 (= m 2) 2 (= m 4) 3 (= m 8) 4 (= m 16) 5 (= m 32) 6 (= m 64) 7 (= m 128) 8 (= m 256) 9 (= m 512) 10 (= m 1024) 11 (= m 2048) 12 (= m 4096) 13 (= m 8192) 14 (= m 16384) 15 (= m 32768) ) (switch i 0 (= b n0) 1 (= b n1) 2 (= b n2) 3 (= b n3) 4 (= b n4) 5 (= b n5) 6 (= b n6) 7 (= b n7) ) (if (!= f 15) (= t (% b (* m 2))) (= t b)) (if (< t m) (+= b m)) (switch i 0 (= n0 b) 1 (= n1 b) 2 (= n2 b) 3 (= n3 b) 4 (= n4 b) 5 (= n5 b) 6 (= n6 b) 7 (= n7 b) ) ) ) ) (= n 0) (while (<= n 127) (do ; Check for note events at current note # ... (= i (/ n 16)) (= f (- n (* i 16))) (switch f 0 (= m 1) 1 (= m 2) 2 (= m 4) 3 (= m 8) 4 (= m 16) 5 (= m 32) 6 (= m 64) 7 (= m 128) 8 (= m 256) 9 (= m 512) 10 (= m 1024) 11 (= m 2048) 12 (= m 4096) 13 (= m 8192) 14 (= m 16384) 15 (= m 32768) ) (switch i 0 (= b n0) 1 (= b n1) 2 (= b n2) 3 (= b n3) 4 (= b n4) 5 (= b n5) 6 (= b n6) 7 (= b n7) ) ; If there are note events, paste them to the destination track (if (!= f 15) (%= b (* m 2))) (if (>= b m) (do (message "Note # " n " --> Track " (+ 1 nDestTrk)) (SetFilterRange 0 0 TRUE n n) (EditCut From Thru TRUE TRUE FALSE FALSE FALSE FALSE) (EditPasteToTrack From 1 1 TRUE FALSE FALSE FALSE nDestTrk) (switch n 27 (= a "Steam Pop 2") 28 (= a "Steam Pop") 29 (= a "Horn Honk") 30 (= a "Metal Buzz") 31 (= a "Stick") 32 (= a "Low Click") 33 (= a "Metronome Click") 34 (= a "Metronome Click 2") 35 (= a "Bass Drum 2") 36 (= a "Bass Drum") 37 (= a "Rim Shot") 38 (= a "Snare Drum") 39 (= a "Hand Clap") 40 (= a "Elec. Snare Drum") 41 (= a "Low Floor Tom") 42 (= a "Closed High Hat") 43 (= a "High Floor Tom") 44 (= a "Pedal High Hat") 45 (= a "Low Tom") 46 (= a "Open High Hat") 47 (= a "Low Mid Tom") 48 (= a "High Mid Tom") 49 (= a "Low Crash Cymbal") 50 (= a "High Tom") 51 (= a "Low Ride Cymbal") 52 (= a "Chinese Cymbal") 53 (= a "Ride Cymbal Bell") 54 (= a "Tambourine") 55 (= a "Splash Cymbal") 56 (= a "Cowbell") 57 (= a "High Crash Cymbal") 58 (= a "Vibraslap") 59 (= a "High Ride Cymbal") 60 (= a "High Bongo") 61 (= a "Low Bongo") 62 (= a "High Muted Conga") 63 (= a "Open High Conga") 64 (= a "Low Conga") 65 (= a "High Timbale") 66 (= a "Low Timbale") 67 (= a "High Agogo") 68 (= a "Low Agogo") 69 (= a "Cabasa") 70 (= a "Maracas") 71 (= a "Short Samba Whistle") 72 (= a "Long Samba Whistle") 73 (= a "Short Guiro") 74 (= a "Long Guiro") 75 (= a "Claves") 76 (= a "High Wood Block") 77 (= a "Low Wood Block") 78 (= a "Muted Culca") 79 (= a "Open Culca") 80 (= a "Muted Triangle") 81 (= a "Open Triangle") 82 (= a "Shaker") 83 (= a "Jingle Bell") 84 (= a "Bell Tree") 85 (= a "Castanets") 86 (= a "Muted Surdo") 87 (= a "Open Surdo") n (= a (format "Split Note # " n)) ) (TrackName a nDestTrk) (TrackChannel nDestChan nDestTrk) (TrackPort nDestPort nDestTrk) (TrackActive TRUE nDestTrk) (++ nDestTrk) ) ) (++ n) ) ) (= Thru oThru) (= From oFrom) )