home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-03-12 | 3.1 KB | 136 lines | [04] ASCII Text (0x0000) |
- ( POLYPHONY )
-
-
- MASC DEFINITIONS
-
- 960 TO TEMPO
-
- ( DEFINE ARRAY FOR POLYPHONIC VOICES )
- VARIABLE POLY
- 128 ALLOT ( MAXIMUM 32 VOICES )
- POLY 128 0 FILL
-
- ( FREE WILL BE USED TO GET INDEX OF FREE NODE )
- VARIABLE FREE 0 FREE !
-
- ( POLY+0,+1 = COUNTER )
- ( POLY+2,+3 = DUR1 )
- ( POLY+4,+5 = NOTE1/VEL1 )
- ( POLY+6,+7 = DUR2 )
- ( POLY+8,+9 = NOTE2/VEL2 )
-
- : DURINDEX ( I -- ADRS OF DURATION WORD )
- 4 * 2 - POLY + ;
-
- : NOTEINDEX ( I -- ADRS OF NOTE BYTE )
- 4 * POLY + ;
-
- : VELINDEX ( I -- ADRS OF VELOCITY BYTE )
- 4 * 1+ POLY + ;
-
-
- : GETDUR ( INDEX -- DUR ) DURINDEX @ ;
- : GETNOTE ( INDEX -- NOTE ) NOTEINDEX C@ ;
- : GETVEL ( INDEX -- VEL ) VELINDEX C@ ;
- ( HI BIT OF VELOCITY IS USED AS A MARKER FOR PROCESSING NOTES )
-
- : PUTDUR ( NUMBER INDEX -- ) DURINDEX ! ;
- : PUTNOTE ( NUMBER INDEX -- ) NOTEINDEX C! ;
- : PUTVEL ( NUMBER INDEX -- ) VELINDEX C! ;
-
- : GETFREE
- 0 FREE !
- POLY @ 1+ 1 ( LOOP FROM 1 TO COUNTER )
-
- DO I GETDUR 0= 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
- ;
-
-
- ( STORE NOTENUMBER IN FREE NODE)
-
- : ,, ( NOTENUMBER -- )
- GETFREE
- FREE @ PUTNOTE
- MGATE FREE @ PUTDUR
- VEL FREE @ PUTVEL
- ;
-
-
- ( MIDI PITCH NAMES ) DECIMAL : PITCH ( OCT NAME -- ) CREATE ,
- DOES> @ SWAP 12 * + 24 + ,, ;
-
- 0 PITCH B# 0 PITCH C
- 1 PITCH C# 1 PITCH D&
- 2 PITCH D
- 3 PITCH D# 3 PITCH E&
- 4 PITCH E 4 PITCH F&
- 5 PITCH F 5 PITCH E#
- 6 PITCH F# 6 PITCH G&
- 7 PITCH G
- 8 PITCH G# 8 PITCH A&
- 9 PITCH A
- 10 PITCH A# 10 PITCH B&
- 11 PITCH B 11 PITCH C&
- : REST 0 ,, ;
-
-
- ( PLAY NOTES IN THE ARRAY )
-
-
- : ?NEWNOTE ( I -- FLAG )
- GETVEL 128 AND 0= ;
-
- : SETFLAG ( I -- )
- DUP GETVEL 128 OR SWAP PUTVEL ;
-
- VARIABLE SHORTEST
-
- : ?SHORT ( I -- )
- GETDUR DUP 0= IF DROP ELSE SHORTEST @ MIN SHORTEST ! THEN ;
- ( CALCULATES SHORTEST DURATION IN ARRAY )
-
-
- : SUBSHORT ( I -- )
- DUP GETDUR DUP 0= IF DROP DROP ELSE SHORTEST @ - SWAP PUTDUR THEN
- ;
-
- : NOTEOFF ( I -- )
- DUP GETDUR 0= IF GETNOTE UP ELSE DROP THEN
- ;
-
- : FREENODE ( I -- )
- ( DURATION WAS ALREADY ZEROED OUT )
- ( LEAVE NOTE ALONE - FOR NOTEOFF )
- DUP GETDUR 0= IF 128 SWAP PUTVEL ELSE DROP THEN
- ;
-
-
- : // ( -- )
- 32767 SHORTEST !
- POLY @ 1+ 1
-
- ( SEND THE NOTEONS FOR NEW NOTES )
- DO I ?NEWNOTE IF I GETVEL VOL I GETNOTE DOWN I SETFLAG THEN I ?SHORT LOOP
-
- ( DELAY FOR SHORTEST DURATION - NOTE: WAIT DOESN'T CHANGE STACK )
- SHORTEST @ TO MGATE WAIT
-
- ( SUBTRACT SHORTEST FROM EACH DUR <> 0 AND SEND NOTEOFFS IF = 0)
- POLY @ 1+ 1
- DO I GETDUR 0= IF ELSE I SUBSHORT I NOTEOFF THEN LOOP
-
- ( COMPRESS ARRAY? )
- ;
-
-
-
- ( EXAMPLE LINE )
- ( QN 3 C 3 E 3 G EN REST // EN REST // )
-