home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-03-14 | 3.6 KB | 179 lines | [04] ASCII Text (0x0000) |
- ( MIXER - TAKES SEQUENCES AND STORES MIDI-FILE FORMAT DATA )
- ( IN THE CURRENT DEFINITION )
-
- MASC DEFINITIONS
- DEC
- 960 TO TEMPO
-
- \ INTERFACE:
-
- \ SEQUENCE ERIC
- \ MIXER
- \ 0 CHNL SOPRANO TRACK
- \ 1 CHNL ALTO TRACK
- \ 2 CHNL TENOR TRACK
- \ 3 CHNL BASS TRACK
- \ MIX
- \ END-SEQ
-
-
- \ INPUT STREAM ARRAY: INDEX= 1 TO 8
- \ ACTIVE? FLAG
- \ MIDI CHANNEL
- \ ADDRESS POINTER
- \ INDEX ASSIGNED BY POLY
-
-
- 9 CONSTANT MAXTRACK
-
- MAXTRACK PARAMETERS CHNLARRAY
-
- MAXTRACK PARAMETERS ACTIVE?
- MAXTRACK PARAMETERS INPUTADRS
- MAXTRACK PARAMETERS INPUTCHNL
- MAXTRACK PARAMETERS POLYINDEX
- 0 PARAMETER INPUTINDEX
-
- 0 PARAMETER CHNL%
-
- : GETCHNL ( I -- ) ( SETS UP CHNL% )
- CHNLARRAY TO CHNL%
- ;
-
- : PUTCHNL ( VALUE I -- )
- TO CHNLARRAY
- ;
-
-
- : MXFREENODE ( I -- )
- DUP GETNOTE 128 OR SWAP PUTNOTE
- ;
-
-
- \ MIXER - CLEAR INPUT STREAM ARRAY
- \ AND RESET POLY INDEX
- \ FREE ALL POLY NODES
-
- : MIXER
- 0 TO INPUTINDEX
- 0 POLY !
- MAXTRACK 0 DO I MXFREENODE LOOP
- ;
-
- \ TRACK ( START.ADRS, LEN -- )
- \ DROP THE LEN, ALLOCATE NEW POSITION IN
- \ INPUT STREAM ARRAY
- \ STOP IF MORE THAN MAXTRACK POSITIONS ALLOCATED
- \ GET CHANNEL, STORE START.ADRS AND CHANNEL IN
- \ INPUT STREAM ARRAY
- \ SET ACTIVE TO 1
-
- : ALLOCATE ( -- INDEX )
- INPUTINDEX 1+ DUP
- DUP MAXTRACK > IF ABORT THEN
- TO INPUTINDEX
- ;
-
- : TRACK ( START.ADRS, LENGTH -- )
- DROP ALLOCATE SWAP OVER TO INPUTADRS
- CHANNEL OVER TO INPUTCHNL
- 1 SWAP TO ACTIVE?
- ;
-
-
-
- : GETFREE2
- 0 FREE !
- POLY @ 1+ 1 ( LOOP FROM 1 TO COUNTER )
-
- DO I GETNOTE 128 > IF FREE @ 0= IF I FREE ! LEAVE THEN THEN LOOP
- ( IF DUR#I = 0, CHECK FREE AND STORE INDEX )
-
- ( IF REACHED END OF LOOP WITHOUT CHANGING FREE - ADD 1 TO COUNTER )
- FREE @ 0= IF POLY @ 1+ DUP POLY ! FREE ! THEN
-
- ( SPECIAL CASE FOR POLY=0 )
- POLY @ 0= IF 1 POLY ! THEN
- ;
-
-
- \ MIX - FEED EVERYBODY FIRST EVENT AND CALL FEEDPOLY TO COMPILE
-
-
- : FILLPOLY ( I -- ) ( FORMERLY ,, )
- GETFREE2
- FREE @ OVER TO POLYINDEX
- DUP INPUTADRS @ FREE @ PUTDUR
- DUP INPUTADRS 2+ C@ FREE @ PUTNOTE
- DUP INPUTADRS 3 + C@ FREE @ PUTVEL
- INPUTCHNL FREE @ PUTCHNL
- ;
-
- : FEEDFIRST
- INPUTINDEX 1+ 0 DO I FILLPOLY LOOP
- ;
-
-
- \ ***************************************
- \ * NEW VERSIONS OF OLD SUBROUTINES *
- \ ***************************************
-
- : MXDELAY, DLY% 128 < IF DLY% C, ELSE DLY% , THEN ;
-
- : MXUP, CHNL% C, , ; ( VEL=0 BECAUSE HI BYTE = 0 )
-
- : MXDOWN, CHNL% C, VEL 256 * + , ;
-
-
- : MXNOTEOFF ( I -- )
- DUP GETDUR 0=
- IF DUP GETNOTE GETCHNL MXDELAY, MXUP, 0 TO DLY% ELSE DROP THEN
- ;
-
- : MXNOTEON ( I -- )
- 0 TO DLY% MXDELAY,
- DUP GETNOTE GETCHNL MXDOWN,
- ;
-
- \ ***** NOTE: FEEDPOLY HAS TO SET THE PARAMETER CHNL% *****
-
- : FEEDPOLY ( -- ) ( FORMERLY // )
-
- 32767 SHORTEST !
- POLY @ 1+ 1
-
- ( SEND THE NOTEONS FOR NEW NOTES )
- DO I ?NEWNOTE IF I GETVEL VOL I MXNOTEON I SETFLAG THEN I ?SHORT LOOP
-
- ( SET UP DELAY FOR SHORTEST DURATION )
- SHORTEST @ TO DLY%
-
- ( SUBTRACT SHORTEST FROM EACH DUR <> 0 AND SEND NOTEOFFS IF = 0)
- POLY @ 1+ 1
- DO I GETDUR 0= IF ELSE I SUBSHORT I MXNOTEOFF I MXFREENODE THEN LOOP
-
- ;
-
- \ **************************************************************
-
- : MIX
- FEEDFIRST FEEDPOLY
- ;
-
- \
- \ SCAN INPUT STREAM ARRAY, FIND TRACKS BEING USED NOW,
- \ SET CHANNEL TO CHANNEL FOR THAT TRACK, USE ,, TO FEED POLY
- \ RESET ORIGINAL CHANNEL VALUE
-
- \ FOR I=1 TO INPUTINDEX
- \ IF NODE IS STILL ACTIVE:
- \ CHECK IF THE POLY NODE HAD DURATION ZEROED OUT
- \ YES: ADVANCE INPUTADRS BY 4
- \
- \ FOR EACH POLY NODE WHERE DURATION = 0, LOOK UP ITS INDEX
- \ GET CHANNEL(INDEX) AND SET THE PARAMETER CHANNEL
- \ ADVANCE INPUTSTREAM AND GET NEW DATA.
-
- \ POLY @ 1+ 1
- \ DO I GETDUR 0= IF ELSE THEN LOOP
-