home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Set of Apple II Hard Drive Images
/
eric.hdv
/
ANNMIDI
/
ANNMIDI.WRD.txt
< prev
next >
Wrap
Text File
|
2020-08-13
|
18KB
|
728 lines
( ERIC'S VERSION OF MASC )
( META LANGUAGE FOR ADAPTIVE SYTHESIS )
( MODIFIED FOR ANNUNCIATOR MIDI DRIVER 5/25/1998)
: 2@ DUP 2+ @ OVER @ ROT DROP ;
( APPLE ANNUNCIATOR 0 MIDI INTERFACE REGISTERS )
HEX
C059 CONSTANT AN0ON
: INIT AN0ON C@ DROP ;
DECIMAL
VARIABLE %TO 0 %TO !
: TO 1 %TO ! ;
: FROM/TO
%TO @ IF ! 0 %TO ! ELSE @ THEN ;
: PARAMETER ( N -- NAME )
CREATE , DOES> FROM/TO ;
: PARAMETERS ( SIZE -- NAME )
CREATE DUP , 0 DO 0 , LOOP
DOES> SWAP 2* + 2+ FROM/TO ;
: <BUILDS 0 CONSTANT ;
( MIDI SEQUENCE PLAYBACK ROUTINE )
HEX
VARIABLE USERKEY 0 USERKEY C!
VARIABLE USERSTOP 0 USERSTOP C!
: ?USERSTOP USERSTOP @ IF QUIT THEN ;
VARIABLE PLAYPTR
VARIABLE LASTSTATUS
VARIABLE LENTEST
VARIABLE TEMPA
VARIABLE TEMPX
VARIABLE BIT7 VARIABLE BIT6 VARIABLE BIT5 VARIABLE BIT4
VARIABLE BIT3 VARIABLE BIT2 VARIABLE BIT1 VARIABLE BIT0
VARIABLE STARTBIT 58 STARTBIT C!
VARIABLE STOPBIT 59 STOPBIT C!
1 OBJECT MIDIOUT
BOT LDA,
1 PARM STA,
INX, INX,
OBJ-CODE
1 PARM LDA,
.A ASL, ( CONVERT EACH BIT INTO )
TAX, ( A HEX 58 OR 59 WHICH )
0 # LDA, ( WILL BE USED TO TURN )
58 # ADC, ( ANNUNCIATOR 0 ON OR OFF )
BIT7 STA,
TXA,
.A ASL,
TAX,
0 # LDA,
58 # ADC,
BIT6 STA,
TXA,
.A ASL,
TAX,
0 # LDA,
58 # ADC,
BIT5 STA,
TXA,
.A ASL,
TAX,
0 # LDA,
58 # ADC,
BIT4 STA,
TXA,
.A ASL,
TAX,
0 # LDA,
58 # ADC,
BIT3 STA,
TXA,
.A ASL,
TAX,
0 # LDA,
58 # ADC,
BIT2 STA,
TXA,
.A ASL,
TAX,
0 # LDA,
58 # ADC,
BIT1 STA,
TXA,
.A ASL,
TAX,
0 # LDA,
58 # ADC,
BIT0 STA,
TXA,
STARTBIT LDX, ( 4 CYCLES )
C000 ,X LDA, ( 4 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
BIT0 LDX, ( 4 CYCLES )
C000 ,X LDA, ( 4 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
BIT1 LDX, ( 4 CYCLES )
C000 ,X LDA, ( 4 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
BIT2 LDX, ( 4 CYCLES )
C000 ,X LDA, ( 4 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
BIT3 LDX, ( 4 CYCLES )
C000 ,X LDA, ( 4 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
BIT4 LDX, ( 4 CYCLES )
C000 ,X LDA, ( 4 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
BIT5 LDX, ( 4 CYCLES )
C000 ,X LDA, ( 4 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
BIT6 LDX, ( 4 CYCLES )
C000 ,X LDA, ( 4 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
BIT7 LDX, ( 4 CYCLES )
C000 ,X LDA, ( 4 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
NOP, NOP, NOP, NOP, NOP, NOP, ( 12 CYCLES )
STOPBIT LDX, ( 4 CYCLES )
C000 ,X LDA, ( 4 CYCLES )
OBJ-END
HEX
VARIABLE SPEEDVAL 1A SPEEDVAL !
: SETSPEED ( NUM -- ) SPEEDVAL ! ;
: GETSPEED ( -- NUM ) SPEEDVAL @ ;
2 OBJECT DELTA \ DELAY FOR DELTA TIME PASSED IN
BOT LDA,
1 PARM STA,
BOT 1+ LDA,
2 PARM STA,
INX, INX,
OBJ-CODE
CLC,
1 PARM LDA,
0= IF,
2 PARM LDA,
0= IF,
SEC,
THEN,
THEN,
CS NOT IF,
BEGIN,
SPEEDVAL LDA,
HEX FCA8 JSR, \ CALL APPLE DELAY ROUTINE
1 PARM DEC, \ DECREMENT 2 BYTE VALUE
1 PARM LDA,
FF # CMP,
0= IF,
2 PARM DEC,
THEN,
CLC,
1 PARM LDA,
0= IF,
2 PARM LDA,
0= IF,
SEC,
THEN,
THEN,
CS UNTIL,
THEN,
OBJ-END
2 OBJECT PLAY
BOT 2 + LDA,
PLAYPTR STA,
BOT 3 + LDA,
PLAYPTR 1+ STA,
INX, INX, INX, INX,
OBJ-CODE
0 # LDA,
USERKEY STA,
USERSTOP STA,
CLC,
PLAYPTR LDA, \ GET START ADRS OF SEQUENCE INTO N
8 # ADC,
N STA,
PLAYPTR 1+ LDA,
0 # ADC,
N 1+ STA,
BEGIN,
C000 LDA, \ CHECK IF KEY PRESSED
0< IF,
C010 LDA,
7F # AND,
USERKEY STA, \ SAVE USER'S KEY
1B # CMP, \ USER WANTS TO ESCAPE
0= IF,
1 # LDA,
USERSTOP STA,
OBJ-EXIT
THEN,
20 # CMP, \ SPACEBAR = EXIT NOW BUT DONT STOP
0= IF,
OBJ-EXIT
THEN,
THEN,
0 # LDY, \ GET 1ST BYTE OF DELTA TIME
N )Y LDA,
0< IF, \ IF > $80
7F # AND, \ MASK HI BIT, SHIFT RIGHT
.A LSR,
2 'PARM DELTA STA, \ SAVE DELTA TIME HI BYTE
0 # LDA, \ GET LO BIT OF THAT BYTE INTO HI BIT OF A
.A ROR,
INY, \ OR IT WITH THE SECOND DELTA TIME BYTE
N )Y ORA,
1 'PARM DELTA STA, \ SAVE AS THE LO BYTE OF DELTA
CLC, \ INCREMENT N BY 2
N LDA,
2 # ADC,
N STA,
N 1+ LDA,
0 # ADC,
N 1+ STA,
CLC, \ SIGNAL THAT WE WANT TO CALL DELTA
ELSE,
0= IF,
CLC, \ INCREMENT N BY 1
N LDA,
1 # ADC,
N STA,
N 1+ LDA,
0 # ADC,
N 1+ STA,
SEC, \ SIGNAL THAT WE DONT WANT TO CALL DELTA
ELSE,
1 'PARM DELTA STA, \ STORE 1 BYTE DELTA TIME
0 # LDA,
2 'PARM DELTA STA,
CLC, \ INCREMENT N BY 1
N LDA,
1 # ADC,
N STA,
N 1+ LDA,
0 # ADC,
N 1+ STA,
CLC,
THEN,
THEN,
CS NOT IF,
OBJ-CALL DELTA \ ONLY IF NON 0 DELTA TIME ABOVE
THEN,
0 # LDY, \ GET MIDI INSTRUCTION
N )Y LDA,
FF # CMP, \ CHECK FOR END-OF-TRACK
0= IF,
SEC,
ELSE,
N )Y LDA, \ GET THE SAME BYTE AGAIN
0< IF, \ IF > $80
LASTSTATUS STA, \ SAVE IT AS THE CURR STS BYTE
1 'PARM MIDIOUT STA,
OBJ-CALL MIDIOUT
CLC, \ INCREMENT N BY 1
N LDA,
1 # ADC,
N STA,
N 1+ LDA,
0 # ADC,
N 1+ STA,
N )Y LDA, \ GET DATA BYTE
THEN,
1 'PARM MIDIOUT STA,
OBJ-CALL MIDIOUT
\ DETERMINE IF 1 OR 2 BYTE INSTRUCTION
2 # LDA,
LENTEST STA,
LASTSTATUS LDA, \ CHECK STATUS BYTE
C0 # CMP,
CS IF,
E0 # CMP,
CC IF, \ 1 BYTE
1 # LDA,
LENTEST STA,
THEN,
THEN,
LENTEST LDA,
2 # CMP,
0= IF,
1 # LDY,
N )Y LDA,
1 'PARM MIDIOUT STA,
OBJ-CALL MIDIOUT
CLC, \ INCREMENT N BY 2
N LDA,
2 # ADC,
N STA,
N 1+ LDA,
0 # ADC,
N 1+ STA,
THEN,
CLC, \ SIGNAL THAT MORE WORK TO DO
THEN,
CS UNTIL,
OBJ-END
0 PARAMETER DEBUGGING
0 PARAMETER SEQUENCING
0 PARAMETER NEEDZERODLY
0 PARAMETER PREVSTAT
0 PARAMETER DLYLENGTH
HEX
: MSND ( BYTE -- )
DEBUGGING IF HEX . DEC ELSE
SEQUENCING IF
NEEDZERODLY IF
0 C, 0 TO NEEDZERODLY
THEN
DUP 7F > OVER F0 < AND IF
DUP PREVSTAT = IF ( CHECK FOR RUNNING STS )
DROP
ELSE
DUP TO PREVSTAT C,
THEN
ELSE
C,
THEN
0 TO DLYLENGTH ( TO SIGNAL THAT THERE WAS AN EVENT SINCE LAST DELAY )
ELSE
MIDIOUT
THEN
THEN
;
VARIABLE JOYX 0 JOYX !
VARIABLE JOYY 0 JOYY !
HEX
CODE JOY
XSAVE STX,
0 # LDX, 0 # LDY, 80 # LDA, SEC,
C070 BIT, C064 BIT, 10 C, 03 C, INX, D0 C, 02 C,
NOP, NOP, C065 BIT, 10 C, 03 C, INY, D0 C, 02 C,
NOP, NOP, 1 # SBC, B0 C, E8 C,
' JOYX STX, ' JOYY STY,
XSAVE LDX, NEXT JMP,
END-CODE
HEX
40 PARAMETER VEL ( KEY VELOCITY)
40 PARAMETER SAVEVEL
10 PARAMETER ACCENTINC ( ACCENTED KEY VELOCITY)
0 PARAMETER CHANNEL
: VOL ( NUM -- ) DUP TO VEL TO SAVEVEL ;
: AC ( -- ) VEL DUP TO SAVEVEL ACCENTINC + TO VEL ;
: CHNL ( NUM --) TO CHANNEL ;
: END-INST
1 TO NEEDZERODLY ;
: ON ( KEY -- ) 90 CHANNEL 0F AND
+ MSND MSND VEL MSND END-INST ;
: OFF ( KEY -- ) 90 CHANNEL 0F AND
+ MSND MSND 0 MSND END-INST ;
: CTRL-CHG ( VALUE CTRL-NUMBER -- )
CHANNEL 0F AND B0 + MSND MSND MSND END-INST ;
: RESETCTRLS 0 79 CTRL-CHG ;
0 PARAMETER VARIATION
: VAR ( VARIATION# -- )
TO VARIATION ;
: PGM ( PROGRAM -- )
VARIATION 0 CTRL-CHG 0 32 CTRL-CHG
C0 CHANNEL 0F AND + MSND 1 - MSND END-INST ;
: AFTERTOUCH ( KEY VALUE -- )
CHANNEL 0F AND A0 + MSND SWAP MSND MSND END-INST ;
: PRESSURE ( VALUE )
CHANNEL 0F AND D0 + MSND MSND END-INST ;
: BEND ( -8192 THRU +8191 )
CHANNEL 0F AND E0 + MSND
DUP 80 MOD MSND 80 / MSND END-INST ;
( CONTROLLERS )
HEX
: DAMPER ( 0..7 -- )
0 MAX 7 MIN 10 * 40 CTRL-CHG ;
: SOST ( 1=ON 0=OFF -- )
0 MAX 1 MIN 40 * 42 CTRL-CHG ;
: SOFT ( 1=ON 0=OFF -- )
0 MAX 1 MIN 40 * 43 CTRL-CHG ;
: MODWHEEL ( 0-127 ) 7F AND 1 CTRL-CHG ;
: VOLUME ( 0-127 ) 7F AND 7 CTRL-CHG ;
: EXPRESSION ( 0-127 ) 7F AND 0B CTRL-CHG ;
: PORTAMENTO ( 0-127 ) 7F AND 41 CTRL-CHG ;
: PANPOT ( 0-40-7F = LEFT,CENTER,RIGHT ) 7F AND 0A CTRL-CHG ;
: PORTATIME ( 0-127 ) 7F AND 5 CTRL-CHG ;
: REVERB ( 0-127 ) 7F AND 5B CTRL-CHG ;
: CHORUS ( 0-127 ) 7F AND 5D CTRL-CHG ;
DECIMAL
: DELAY ( INTEGER -- )
SEQUENCING IF
DLYLENGTH 1 = IF ( THERE HASN'T BEEN AN EVENT SINCE LAST DELAY)
-1 ALLOT HERE C@ + ( ADD PREV DELAY TO THIS DELAY)
THEN
DLYLENGTH 2 = IF
-2 ALLOT HERE C@ 128 - 128 * HERE 1+ C@ + +
THEN
0 TO NEEDZERODLY
1 TO DLYLENGTH
DUP 127 > IF
DUP 128 / 128 + C, 2 TO DLYLENGTH
THEN
128 MOD C,
ELSE
DELTA
THEN
;
240 PARAMETER MGATE
: // MGATE DELAY SAVEVEL TO VEL ;
: KK ( KEY -- )
DUP ON // OFF ;
: CD+ ( NUM -- )
0 DO I PICK ON LOOP ;
: CD- ( NUM -- )
0 DO I PICK OFF LOOP ;
HEX
: MUTE ( CHNL -- ) ( TURNS ALL SOUNDS OFF FOR CHANNEL )
B0 + MSND 78 MSND 00 MSND END-INST ;
: SHUTUP
CHANNEL MUTE ;
: QUIET ( -- )
10 0 DO I MUTE LOOP ;
4 PARAMETER OCTAVE
: OCT ( N -- ) TO OCTAVE ;
: O+ ( -- ) OCTAVE 1+ TO OCTAVE ;
: O- ( -- ) OCTAVE 1 - TO OCTAVE ;
DECIMAL
: PITCH ( NAME -- ) CREATE ,
DOES> @ OCTAVE 12 * + 12 + ;
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&
960 PARAMETER WHOLEDELTA
: DURATION CREATE , , DOES>
WHOLEDELTA SWAP 2@ */ TO MGATE ;
2 1 DURATION BN 4 3 DURATION BN3
1 1 DURATION WN 2 3 DURATION WN3
1 2 DURATION HN 1 3 DURATION HN3
1 4 DURATION QN 1 6 DURATION QN3
1 8 DURATION EN 1 12 DURATION EN3
1 16 DURATION SN 1 24 DURATION SN3
1 32 DURATION TN 1 48 DURATION TN3
1 64 DURATION GN 1 96 DURATION GN3
3 2 DURATION WN.
3 4 DURATION HN.
3 8 DURATION QN.
3 16 DURATION EN.
3 32 DURATION SN.
3 64 DURATION TN.
1 80 DURATION GN5
1 40 DURATION TN5
1 20 DURATION SN5
1 10 DURATION EN5
1 5 DURATION QN5
2 5 DURATION HN5
4 5 DURATION WN5
8 5 DURATION BN5
0 PARAMETER TIEVAL
: <TIE
0 TO TIEVAL ;
: &
MGATE TIEVAL + TO TIEVAL ;
: TIE>
& TIEVAL TO MGATE ;
( GRACE NOTES - SUBTRACTION WITHIN A TIE )
( EX: 3 C GN // 3 D HN GN- // )
: GN-
MGATE GN MGATE - TO MGATE
;
: CD ( KEYS NUM -- ) ( PLAY A CHORD )
DUP 0 DO I 2 + PICK ON LOOP
MGATE DELAY 0 DO OFF LOOP ;
( PASTING SEQUENCES )
HEX
VARIABLE LASTDLY
VARIABLE LASTDLYLEN
VARIABLE FIRSTDLY
VARIABLE FIRSTDLYLEN
: PASTE ( ADRS LEN -- )
\ MAKE SURE WE HAVE A DELAY
NEEDZERODLY IF 0 C, 0 TO NEEDZERODLY THEN
\ GET LAST DELAY OF CURRENT SEQUENCE
0 LASTDLY !
1 LASTDLYLEN !
HERE 2 - C@ \ CHECK 2 PREVIOUS BYTES TO GET DELAY
DUP 7F > IF
80 - 80 * LASTDLY !
2 LASTDLYLEN !
ELSE
DROP
THEN
HERE 1 - C@
LASTDLY @ + LASTDLY !
\ GET FIRST DELAY OF NEW SEQUENCE
SWAP 8 + SWAP OVER \ POINT TO FIRST DELAY
C@
0 FIRSTDLY !
1 FIRSTDLYLEN !
DUP 7F > IF
80 - 80 * FIRSTDLY !
2 FIRSTDLYLEN !
OVER 1+ C@
FIRSTDLY @ + FIRSTDLY !
ELSE
FIRSTDLY !
THEN
\ STORE SUM OVER OLD DELAY
LASTDLYLEN @ -1 * ALLOT
LASTDLY @ FIRSTDLY @ +
DUP 7F > IF
DUP 80 / 80 + C,
80 MOD
THEN C,
\ PREPARE FOR CMOVE
\ STACK CURRENTLY HAS: ADRS OF FIRSTDLY, SEQ LEN
SWAP FIRSTDLYLEN @ + \ POINT TO FIRST EVENT OF NEW SEQ
SWAP 8 - FIRSTDLYLEN @ - 3 - \ ADJUST LEN FOR HEADER (8)
\ AND TRAILER (3) AND FIRST DELAY
DUP ROT ROT \ LEN ADRS LEN
HERE SWAP \ LEN ADRS HERE LEN
CMOVE \ LEN
ALLOT
1 TO DLYLENGTH \ ADJUST DLYLENGTH FOR FUTURE EVENTS
HERE 2 - C@ 7F > IF
2 TO DLYLENGTH
THEN
0 TO PREVSTAT
0 TO NEEDZERODLY \ GET READY FOR ADDING MORE TO SEQUENCE
;
( FORTH SEQUENCER )
HEX
1 PARAMETER PLAYING \ SET TO 1 TO PLAY SEQUENCES BY NAMING THEM
( SEQUENCE STORES 0 AS THE INITIAL LENGTH AND PFA ADRS FOR END-SEQ)
( WHEN WORD IS EXECUTED, RETURNS STARTING ADDRESS AND LENGTH )
VARIABLE SEQPFA
: SEQUENCE ( -- ) ( -- STARTADRS, LENGTH )
CREATE HERE SEQPFA !
0 C, FF C, 7F C, 04 C, GETSPEED , 0 ,
0 TO PREVSTAT
1 TO NEEDZERODLY
1 TO SEQUENCING
0 TO DLYLENGTH ( IN CASE FIRST EVENT IN SEQUENCE IS A DELAY )
DOES> DUP 6 + @
SEQUENCING IF PASTE ELSE PLAYING IF PLAY THEN THEN
;
: END-SEQ
( STORE TERMINATOR BYTES FOR PLAYBACK PROGRAM )
NEEDZERODLY IF
0 C,
THEN
FF C, 2F C, 0 C,
0 TO PREVSTAT
0 TO NEEDZERODLY
0 TO SEQUENCING
( CALCULATE LENGTH OF SEQUENCE & STORE IT )
HERE SEQPFA @ - SEQPFA @ 6 + !
;
( LOADING AND SAVING SEQUENCES )
( SYNTAX: PREFIX" /PATHNAME" )
: PREFIX"
1 PAD C! ASCII " WORD PAD 1+ ! PAD C6 MLI
;
: BSAVE" ( START.ADRS LENGTH -- )
OVER ( ADRS LEN ADRS )
ASCII " WORD DUP ( ADRS LEN ADRS WORD WORD )
ROT ( ADRS LEN WORD WORD ADRS )
6 ( BIN ) SWAP ( ADRS LEN WORD WORD 6 ADRS )
( CREATEF USES TOP 3 PARMS, OPENF USES WORD, WRITEF USES ADRS,LEN )
(CREATEF) ?DERR \ CREATE NEW FILE
(OPENF) ?DERR \ PASS PATHNAME - RETURN FILE#
(WRITEF) ?DERR \ WRITE THE BINARY DATA TO THE FILE
0 (CLOSEF) ?DERR
;