home *** CD-ROM | disk | FTP | other *** search
/ Set of Apple II Hard Drive Images / hard.hdv / HARD / FORTH / MIXER1.WRD < prev    next >
Encoding:
Text File  |  1991-03-14  |  3.6 KB  |  179 lines  |  [04] ASCII Text (0x0000)

  1. ( MIXER - TAKES SEQUENCES AND STORES MIDI-FILE FORMAT DATA )
  2. (         IN THE CURRENT DEFINITION )
  3.  
  4. MASC DEFINITIONS
  5. DEC
  6. 960 TO TEMPO
  7.  
  8. \ INTERFACE:
  9.  
  10. \ SEQUENCE ERIC
  11. \   MIXER
  12. \    0 CHNL SOPRANO TRACK
  13. \    1 CHNL ALTO TRACK 
  14. \    2 CHNL TENOR TRACK
  15. \    3 CHNL BASS TRACK
  16. \   MIX
  17. \ END-SEQ
  18.  
  19.  
  20. \ INPUT STREAM ARRAY: INDEX= 1 TO 8
  21. \   ACTIVE? FLAG
  22. \   MIDI CHANNEL
  23. \   ADDRESS POINTER
  24. \   INDEX ASSIGNED BY POLY
  25.  
  26.  
  27. 9 CONSTANT MAXTRACK
  28.  
  29. MAXTRACK PARAMETERS CHNLARRAY
  30.  
  31. MAXTRACK PARAMETERS ACTIVE?
  32. MAXTRACK PARAMETERS INPUTADRS
  33. MAXTRACK PARAMETERS INPUTCHNL
  34. MAXTRACK PARAMETERS POLYINDEX
  35. 0 PARAMETER INPUTINDEX
  36.  
  37. 0 PARAMETER CHNL%
  38.  
  39. : GETCHNL ( I -- )  ( SETS UP CHNL% )
  40.    CHNLARRAY TO CHNL%
  41. ;
  42.  
  43. : PUTCHNL ( VALUE I -- ) 
  44.    TO CHNLARRAY
  45. ;
  46.  
  47.  
  48. : MXFREENODE ( I -- )
  49.    DUP GETNOTE 128 OR SWAP PUTNOTE   
  50. ;
  51.  
  52.  
  53. \  MIXER - CLEAR INPUT STREAM ARRAY 
  54. \          AND RESET POLY INDEX
  55. \          FREE ALL POLY NODES
  56.  
  57. : MIXER 
  58.    0 TO INPUTINDEX 
  59.    0 POLY !
  60.    MAXTRACK 0 DO I MXFREENODE LOOP
  61. ;
  62.  
  63. \ TRACK ( START.ADRS, LEN -- )
  64. \   DROP THE LEN, ALLOCATE NEW POSITION IN 
  65. \   INPUT STREAM ARRAY
  66. \   STOP IF MORE THAN MAXTRACK POSITIONS ALLOCATED
  67. \   GET CHANNEL, STORE START.ADRS AND CHANNEL IN 
  68. \   INPUT STREAM ARRAY
  69. \   SET ACTIVE TO 1
  70.  
  71. : ALLOCATE ( -- INDEX )
  72.    INPUTINDEX 1+ DUP 
  73.    DUP MAXTRACK > IF ABORT THEN
  74.    TO INPUTINDEX
  75. ;
  76.  
  77. : TRACK ( START.ADRS, LENGTH -- )
  78.    DROP ALLOCATE SWAP OVER TO INPUTADRS
  79.    CHANNEL OVER TO INPUTCHNL  
  80.    1 SWAP TO ACTIVE?
  81. ;
  82.  
  83.  
  84.  
  85. : GETFREE2
  86.    0 FREE !
  87.    POLY @ 1+ 1  ( LOOP FROM 1 TO COUNTER )
  88.  
  89.    DO I GETNOTE 128 > IF FREE @ 0= IF I FREE ! LEAVE THEN THEN LOOP
  90.    ( IF DUR#I = 0, CHECK FREE AND STORE INDEX )
  91.  
  92.    ( IF REACHED END OF LOOP WITHOUT CHANGING FREE - ADD 1 TO COUNTER )
  93.    FREE @ 0= IF POLY @ 1+ DUP POLY ! FREE ! THEN 
  94.  
  95.    ( SPECIAL CASE FOR POLY=0 )
  96.    POLY @ 0= IF 1 POLY ! THEN 
  97. ;
  98.  
  99.  
  100. \ MIX - FEED EVERYBODY FIRST EVENT AND CALL FEEDPOLY TO COMPILE
  101.  
  102.  
  103. : FILLPOLY ( I -- )  ( FORMERLY ,, )
  104.    GETFREE2  
  105.    FREE @ OVER TO POLYINDEX
  106.    DUP INPUTADRS @ FREE @ PUTDUR
  107.    DUP INPUTADRS 2+ C@ FREE @ PUTNOTE 
  108.    DUP INPUTADRS 3 + C@ FREE @ PUTVEL
  109.        INPUTCHNL FREE @ PUTCHNL
  110. ;
  111.  
  112. : FEEDFIRST
  113.    INPUTINDEX 1+ 0 DO I FILLPOLY LOOP
  114. ;
  115.  
  116.  
  117. \ ***************************************
  118. \ *  NEW VERSIONS OF OLD SUBROUTINES    *
  119. \ ***************************************
  120.  
  121. : MXDELAY, DLY% 128 < IF DLY% C, ELSE DLY% , THEN ;
  122.  
  123. : MXUP, CHNL% C,  , ;  ( VEL=0 BECAUSE HI BYTE = 0 )
  124.  
  125. : MXDOWN, CHNL% C, VEL 256 * + , ; 
  126.  
  127.  
  128. : MXNOTEOFF ( I -- )
  129.   DUP GETDUR 0= 
  130.   IF DUP GETNOTE GETCHNL MXDELAY, MXUP, 0 TO DLY% ELSE DROP THEN
  131. ;
  132.  
  133. : MXNOTEON ( I -- )
  134.    0 TO DLY% MXDELAY,
  135.    DUP GETNOTE GETCHNL MXDOWN, 
  136. ;
  137.  
  138. \ ***** NOTE: FEEDPOLY HAS TO SET THE PARAMETER CHNL% *****
  139.  
  140. : FEEDPOLY  ( -- )  ( FORMERLY // )
  141.  
  142. 32767 SHORTEST !
  143. POLY @ 1+ 1
  144.  
  145. ( SEND THE NOTEONS FOR NEW NOTES )
  146. DO I ?NEWNOTE IF I GETVEL VOL I MXNOTEON I SETFLAG THEN I ?SHORT LOOP
  147.  
  148. ( SET UP DELAY FOR SHORTEST DURATION )
  149. SHORTEST @ TO DLY%
  150.  
  151. ( SUBTRACT SHORTEST FROM EACH DUR <> 0 AND SEND NOTEOFFS IF = 0)
  152. POLY @ 1+ 1
  153. DO I GETDUR 0= IF ELSE I SUBSHORT I MXNOTEOFF I MXFREENODE THEN LOOP 
  154.  
  155. ;
  156.  
  157. \ **************************************************************
  158.  
  159. : MIX
  160.    FEEDFIRST FEEDPOLY
  161. ;
  162.  
  163. \  
  164. \ SCAN INPUT STREAM ARRAY, FIND TRACKS BEING USED NOW, 
  165. \ SET CHANNEL TO CHANNEL FOR THAT TRACK, USE ,, TO FEED POLY
  166. \       RESET ORIGINAL CHANNEL VALUE
  167.  
  168. \ FOR I=1 TO INPUTINDEX
  169. \   IF NODE IS STILL ACTIVE:
  170. \     CHECK IF THE POLY NODE HAD DURATION ZEROED OUT
  171. \       YES: ADVANCE INPUTADRS BY 4 
  172. \   FOR EACH POLY NODE WHERE DURATION = 0, LOOK UP ITS INDEX
  173. \   GET CHANNEL(INDEX) AND SET THE PARAMETER CHANNEL
  174. \   ADVANCE INPUTSTREAM AND GET NEW DATA.
  175.  
  176. \  POLY @ 1+ 1
  177. \  DO I GETDUR 0= IF   ELSE THEN LOOP 
  178.