LOCATE 0,7 'PRINT " NX MUSIC FILE API" PRINT "NOTHING TO SEE HERE" PRINT "OPEN THE SOURCE CODE" ' N X M U S I C F I L E A P I ' B Y S P 4 C E B A R 'A L L S U B P R O G R A M S I N T H I S L I B R A R Y '- PATTERNS (NX MUSIC FILE): NUMBER (N) IS THE PATTERN NUMBER (0-63) ' - A_PATTERN(N,O,A) : GET PATTERN ADDRESS(NUMBER,OFFSET,ADDRESS RETURN) ' - WS_PATTERN(V,N,P) : WRITE SINGLE PATTERN(VOICE,NUMBER,PARAMETER) ' - RS_PATTERN(V,N,P) : READ SINGLE PATTERN(VOICE,NUMBER,PARAMETER RETURN) ' - WS_FLAG(C,N,P) : WRITE SINGLE FLAG(FLAG,NUMBER,PARAMETER) ' - RS_FLAG(C,N,P) : READ SINGLE FLAG(FLAG,NUMBER,PARAMETER RETURN) ' - W_FLAG(N,P0,P1,P2) : WRITE ALL FLAGS(NUMBER,FLAG PARAMETERS...) ' - R_FLAG(N,P0,P1,P2) : READ ALL FLAGS(NUMBER,FLAG PARAMETER RETURNS...) '- PATTERN REDIRECTS : PATTERN COMMANDS BUT SPECIFIED ' - W_LOOPSTART(N,P) : WRITE THE LOOPSTART FLAG(PATTERN NUMBER,PARAMETER) ' - R_LOOPSTART(N,P) : READ THE LOOPSTART FLAG(PATTERN NUMBER,PARAMETER R) ' - W_LOOPEND(N,P) : WRITE THE LOOPEND FLAG(PATTERN NUMBER,PARAMETER) ' - R_LOOPEND(N,P) : READ THE LOOPEND FLAG(PATTERN NUMBER,PARAMETER R) ' - W_SONGSTOP(N,P) : WRITE THE SONGSTOP FLAG(PATTERN NUMBER,PARAMETER) ' - R_SONGSTOP(N,P) : READ THE SONGSTOP FLAG(PATTERN NUMBER,PARAMETER R) '- TRACKS (NX MUSIC FILE): TRACK NUMBER (N) (0-63) : TIME (T) (0-31) ' - A_TRACK(N,T,O,A) : GET TRACK ADDRESS(NUMBER,TIME,OFFSET,ADDRESS RETURN) ' - WS_TRACKBYTE(N,T,C,P) : WRITE SINGLE BYTE OF TRACK DATA(NUM,TIME,TYPE,PARAM) ' - RS_TRACKBYTE(N,T,C,P) : READ SINGLE BYTE OF TRACK DATA(NUM,TIME,TYPE,PARAM R) ' - WS_NOTE(N,T,P) : WRITE SINGLE MUSIC NOTE (NUM,TIME,PARAM) ' - RS_NOTE(N,T,P) : READ SINGLE MUSIC NOTE (NUM,TIME,PARAM R) ' - WS_TRACK(N,T,C,P) : WRITE SINGLE TRACK PARAMETER (NUM,TIME,TYPE,PARAM) ' - RS_TRACK(N,T,C,P) : READ SINGLE TRACK PARAMETER (NUM,TIME,TYPE,PARAM R) ' - W_TRACK(N,T,P0,P1,P2,P3): WRITE ALL TRACK PARAMETERS (NUM,TIME,PARAMS...) ' - R_TRACK(N,T,P0,P1,P2,P3): READ ALL TRACK PARAMETERS (NUM,TIME,PARAMS R...) '- TRACK REDIRECTS : TRACK COMMANDS BUT SPECIFIED ' - W_TRACKVOLUME(N,T,P) : WRITE VOLUME (TRACK NUMBER,TIME,PARAMETER) ' - R_TRACKVOLUME(N,T,P) : READ VOLUME (TRACK NUMBER,TIME,PARAMETER R) ' - W_TRACKSYNTH(N,T,P) : WRITE SYNTH (TRACK NUMBER,TIME,PARAMETER) ' - R_TRACKSYNTH(N,T,P) : READ SYNTH (TRACK NUMBER,TIME,PARAMETER R) ' - W_TRACKPARAMETER(N,T,P) : WRITE PARAMETER (TRACK NUMBER,TIME,PARAMETER) ' - R_TRACKPARAMETER(N,T,P) : READ PARAMETER (TRACK NUMBER,TIME,PARAMETER R) ' - W_TRACKCOMMAND(N,T,P) : WRITE COMMAND (TRACK NUMBER,TIME,PARAMETER) ' - R_TRACKCOMMAND(N,T,P) : READ COMMAND (TRACK NUMBER,TIME,PARAMETER R) '- SYNTHS (NX MUSIC FILE): NUMBER (N) IS THE SYNTH NUMBER (0-15) ' - A_SYNTH(N,O,A) : GET SYNTH ADDRESS(NUMBER,OFFSET,ADDRESS RETURN) ' - W_SOUND(N,W,PW,LE) : WRITE ALL NX SOUND PARAMS(NUMBER,WAVE,PULSE WIDTH,LENGTH) ' - R_SOUND(N,W,PW,LE,LEB) : READ ALL NX SOUND PARAMS(NUMBER,WAVE,PULSE WIDTH,LENGTH) ' - WS_SOUND(N,C,P) : WRITE SINGLE SOUND PARAMETER(NUMBER,TYPE,PARAMETER) ' - RS_SOUND(N,C,P) : READ SINGLE SOUND PARAMETER(NUMBER,TYPE,PARAMETER R) ' - W_ENVELOPE(N,A,D,S,R) : WRITE ALL NX ENVELOPE PARS(NUM,ATTACK,DECAY,SUSTAIN,RELEASE) ' - R_ENVELOPE(N,A,D,S,R) : READ ALL NX ENVELOPE PARS(NUM,ATTACK,DECAY,SUSTAIN,RELEASE) ' - WS_ENVELOPE(N,C,P) : WRITE SINGLE ENVELOPE PARAMETER(NUMBER,TYPE,PARAMETER) ' - RS_ENVELOPE(N,C,P) : READ SINGLE ENVELOPE PARAMETER(NUMBER,TYPE,PARAMETER R) ' - W_LFO(N,R,FR,VOL,PW) : WRITE ALL NX LFO PARAMS(NUM,RATE,FREQ MOD,VOLUME MOD,PWM) ' - R_LFO(N,R,FR,VOL,PW) : READ ALL NX LFO PARAMS(NUM,RATE,FREQ MOD,VOLUME MOD,PWM) ' - WS_LFO(N,C,P) : WRITE SINGLE LFO PARAMETER(NUMBER,TYPE,PARAMETER) ' - RS_LFO(N,C,P) : READ SINGLE LFO PARAMETER(NUMBER,TYPE,PARAMETER R) ' - W_LFO_WAVE(N,W,I,E,T) : WRITE ALL NX LFO WAVE PARS(NUM,WAVE,INVERT,ENVELOPE,TRIGGER) ' - R_LFO_WAVE(N,W,I,E,T) : READ ALL NX LFO WAVE PARS(NUM,WAVE,INVERT,ENVELOPE,TRIGGER) ' - WS_LFO_WAVE(N,C,P) : WRITE SINGLE LFO WAVE PARAMETER(NUMBER,TYPE,PARAMETER) ' - RS_LFO_WAVE(N,C,P) : READ SINGLE LFO WAVE PARAMETER(NUMBER,TYPE,PARAMETER R) '- SYNTH REDIRECTS : SYNTH COMMANDS BUT SPECIFIED ' - VCO : ' - W_PULSEWIDTH(N,P) : WRITE PULSE WIDTH (SYNTH NUMBER,PARAMETER) ' - R_PULSEWIDTH(N,P) : READ PULSE WIDTH (SYNTH NUMBER,PARAMETER R) ' - W_VCOWAVE(N,P) : WRITE VCO WAVE TYPE (SYNTH NUMBER,PARAMETER) ' - R_VCOWAVE(N,P) : READ VCO WAVE TYPE (SYNTH NUMBER,PARAMETER R) ' - W_LENGTH(N,P) : WRITE LENGTH (SYNTH NUMBER,PARAMETER) ' - R_LENGTH(N,P) : READ LENGTH (SYNTH NUMBER,PARAMETER R) ' - ENVELOPE : ' - W_ATTACK(N,P) : WRITE ENVELOPE ATTACK (SYNTH NUMBER,PARAMETER) ' - R_ATTACK(N,P) : READ ENVELOPE ATTACK (SYNTH NUMBER,PARAMETER R) ' - W_DECAY(N,P) : WRITE ENVELOPE DECAY (SYNTH NUMBER,PARAMETER) ' - R_DECAY(N,P) : READ ENVELOPE DECAY (SYNTH NUMBER,PARAMETER R) ' - W_SUSTAIN(N,P) : WRITE ENVELOPE SUSTAIN (SYNTH NUMBER,PARAMETER) ' - R_SUSTAIN(N,P) : READ ENVELOPE SUSTAIN (SYNTH NUMBER,PARAMETER R) ' - W_RELEASE(N,P) : WRITE ENVELOPE RELEASE (SYNTH NUMBER,PARAMETER) ' - R_RELEASE(N,P) : READ ENVELOPE RELEASE (SYNTH NUMBER,PARAMETER R) ' - LFO : ' - W_LFORATE(N,P) : WRITE LFO RATE/SPEED (SYNTH NUMBER,PARAMETER) ' - R_LFORATE(N,P) : READ LFO RATE/SPEED (SYNTH NUMBER,PARAMETER R) ' - W_FREQMOD(N,P) : WRITE LFO FREQUENCY MODULATION (SYNTH NUMBER,PARAMETER) ' - R_FREQMOD(N,P) : READ LFO FREQUENCY MODULATION (SYNTH NUMBER,PARAMETER R) ' - W_VOLMOD(N,P) : WRITE LFO VOLUME MODULATION (SYNTH NUMBER,PARAMETER) ' - R_VOLMOD(N,P) : READ LFO VOLUME MODULATION (SYNTH NUMBER,PARAMETER R) ' - W_PWMOD(N,P) : WRITE LFO PULSE WIDTH MODULATION (SYNTH NUMBER,PARAMETER) ' - R_PWMOD(N,P) : READ LFO PULSE WIDTH MODULATION (SYNTH NUMBER,PARAMETER R) ' - LFO WAVE : ' - W_LFOWAVE(N,P) : WRITE LFO WAVE TYPE (SYNTH NUMBER,PARAMETER) ' - R_LFOWAVE(N,P) : READ LFO WAVE TYPE (SYNTH NUMBER,PARAMETER R) ' - W_LFOINV(N,P) : WRITE LFO INVERT BIT (SYNTH NUMBER,PARAMETER) ' - R_LFOINV(N,P) : READ LFO INVERT BIT (SYNTH NUMBER,PARAMETER R) ' - W_LFOENV(N,P) : WRITE LFO ENVELOPE BIT (SYNTH NUMBER,PARAMETER) ' - R_LFOENV(N,P) : READ LFO ENVELOPE BIT (SYNTH NUMBER,PARAMETER R) ' - W_LFOTRIG(N,P) : WRITE LFO TRIGGER BIT (SYNTH NUMBER,PARAMETER) ' - R_LFOTRIG(N,P) : READ LFO TRIGGER BIT (SYNTH NUMBER,PARAMETER R) '- RAM : ' - COPYSYNTH(V,N) : COPY A SYNTH FROM SOUND RAM TO THE FILE (TO USE NX COMMANDS) ' - LOADSYNTH(V,N) : COPY A SYNTH FROM THE FILE TO SOUND RAM (TO PLAY IT) '- DISK : ' - SAVEMUSIC(F) : SAVE THE MUSIC FILE TO ROM ENTRY "F" ON THE DISK ' - LOADMUSIC(F) : LOAD THE MUSIC FILE FROM ROM ENTRY "F" ON THE DISK '- BACKEND : ' - WRITENIBBLE(A,C,P) : WRITE A 4-BIT PARAMETER(ADDRESS,LOW/HIGH,PARAMETER) ' - READNIBBLE(A,C,P) : READ A 4-BIT PARAMETER(ADDRESS,LOW/HIGH,PARAMETER R) ' - WRITENIBBLES(A,P0,P1) : WRITE TWO 4-BIT PARAMETERS(ADDRESS,PARAMETERS...) ' - READNIBBLES(A,P0,P1) : READ TWO 4-BIT PARAMETERS(ADDRESS,PARAMETER RETURNS...) ' - WRITEBITS(A,S,N,P) : WRITE AN N-BIT PARAMETER(ADDRESS,SIGNIFICANCE,LENGTH,PAR) ' - READBITS(A,S,N,P) : READ AN N-BIT PARAMETER(ADDRESS,SIGNIFICANCE,LENGTH,PAR R) ' - WRITEBIT(A,S,P) : WRITE A 1-BIT PARAMETER(ADDRESS,SIGNIFICANCE,PARAMETER) ' - READBIT(A,S,P) : READ A 1-BIT PARAMETER(ADDRESS,SIGNIFICANCE,PARAMETER R) 'PARAMETERS AREN'T CLIPPED: KEEP THEM IN BOUNDS OR CORRUPTION HAPPENS 'USEFUL NX COMMANDS TO SIMPLIFY MUSIC SOFTWARE '- SOUND SOURCE A (TO USE THE BUILT-IN PLAYER ON YOUR MUSIC) '- MUSIC(N) (TO SYNC YOUR DAW WITH THE BUILT-IN PLAYER) 'NX MUSIC FILE FACTS 'SYNTHS ' A SYNTH IS A BUNCH OF PARAMETERS THAT DESCRIBE HOW YOUR SOUND SOUNDS ' THERE ARE 16 SYNTHS 'PATTERNS ' A PATTERN STORES WHAT TRACK IS PLAYING AT WHAT TIME ' THERE ARE 64 PATTERNS ' A PATTERN ALSO HAS FLAG BITS THAT TELL THE MUSIC PLAYER TO LOOP OR TO STOP 'TRACKS ' THERE ARE 64 TRACKS WITH 32 TIME UNITS IN EACH OF THEM ' IN A TRACK MANY PARAMETERS CAN BE DEFINED FOR EACH TIME UNIT (IS CALLED A TIME QUANTUM) ' - MUSIC NOTES ' - VOLUME (YOU CAN ADD DYNAMICS TO YOUR SONGS) ' - SYNTH (YOU CAN SWITCH THE SYNTH IN YOUR SONGS) ' - THIS COULD BE USED TO MAP VIRTUAL VOICES TO THE 4 VOICES ' - PARAMETER AND COMMAND ' - COMMAND 0 ' - PARAMETER 0: NO COMMAND ' - PARAMETER 1: MIX LEFT ' - PARAMETER 2: MIX RIGHT ' - PARAMETER 3: MIX CENTER ' - COMMAND F ' - PARAMETER 0: BREAK TRACK/PATTERN ' - PARAMETER 1: CUT NOTE / VOLUME 0 ' - COMMANDS WHERE PARAMETERS ARE USED TO SET 4-BIT VALUES ' - COMMAND 1: ATTACK TIME ' - COMMAND 2: DECAY TIME ' - COMMAND 3: SUSTAIN LEVEL ' - COMMAND 4: RELEASE TIME ' - COMMAND 5: LFO RATE ' - COMMAND 6: LFO FREQUENCY AMOUNT ' - COMMAND 7: LFO VOLUME ' - COMMAND 8: LFO PULSE WIDTH AMOUNT ' - COMMAND 9: PULSE WIDTH ' ... ' - COMMAND D: SLOW SPEED ((TICKS+16) PER ROW) ' - COMMAND E: SPEED (TICKS PER ROW, 8 BY DEFAULT) '- API V2.0 COULD USE LESS SUBS WHICH ARE SLOWER BUT MORE FLEXIBLE '- EACH ACCEPTS MULTIPLE PARAMETERS '- IF A PARAMETER IS -1 THEN OMMIT AND KEEP THE DATA INTACT '- IF A PARAMETER IS -2 THEN READ AND RETURN 'DESCRIPTIONS OF LETTER VARIABLES OF ALL SUBPROGRAMS EXCEPT SYNTHS 'V VOICE 'N NUMBER 'T TIME 'C COMMAND 'P PARAMETER 'A ADDRESS 'S SIGNIFICANCE (LOW/HIGH) OF NIBBLES (4-BIT VALUES) 'SUBPROGRAM NAMES 'A_ ADDRESS 'W_ WRITE 'R_ READ 'WS_ WRITE A SINGLE PARAMETER 'RA_ READ A SINGLE PARAMETER SOUND_ADDRESS=$A000 GLOBAL SOUND_ADDRESS 'P A T T E R N S SUB A_PATTERN(N,O,A) A=SOUND_ADDRESS+128+N*4+O END SUB SUB WS_PATTERN(V,N,P) A=0 CALL A_PATTERN(N,V,A) CALL WRITEBITS(A,0,6,P) 'POKE A,(PEEK(A)\128)*128+P END SUB SUB RS_PATTERN(V,N,P) A=0 CALL A_PATTERN(N,V,A) CALL READBITS(A,0,6,P) 'P=PEEK(A) MOD 128 END SUB SUB WS_FLAG(C,N,P) A=0 CALL A_PATTERN(N,C,A) CALL WRITEBIT(A,7,P) 'POKE A,(PEEK(A) MOD 128)+P*128 END SUB SUB RS_FLAG(C,N,P) A=0 CALL A_PATTERN(N,C,A) CALL READBIT(A,7,P) 'P=PEEK(A)\128 END SUB SUB W_FLAG(N,P0,P1,P2) A=0 CALL A_PATTERN(N,0,A) CALL WRITEBIT(A ,7,P0) CALL WRITEBIT(A+1,7,P1) CALL WRITEBIT(A+2,7,P2) 'POKE A ,(PEEK(A) MOD 128)+P0*128 'POKE A+1,(PEEK(A) MOD 128)+P1*128 'POKE A+2,(PEEK(A) MOD 128)+P2*128 END SUB SUB R_FLAG(N,P0,P1,P2) A=0 CALL A_PATTERN(N,0,A) CALL READBIT(A ,7,P0) CALL READBIT(A+1,7,P1) CALL READBIT(A+2,7,P2) 'P0=PEEK(A )\128 'P1=PEEK(A+1)\128 'P2=PEEK(A+2)\128 END SUB 'P A T T E R N R E D I R E C T S SUB W_LOOPSTART(N,P) CALL WS_FLAG(0,N,P) END SUB SUB R_LOOPSTART(N,P) CALL RS_FLAG(0,N,P) END SUB SUB W_LOOPEND(N,P) CALL WS_FLAG(1,N,P) END SUB SUB R_LOOPEND(N,P) CALL RS_FLAG(1,N,P) END SUB SUB W_SONGSTOP(N,P) CALL WS_FLAG(2,N,P) END SUB SUB R_SONGSTOP(N,P) CALL RS_FLAG(2,N,P) END SUB 'T R A C K S SUB A_TRACK(N,T,O,A) A=SOUND_ADDRESS+384+N*96+T*3+O END SUB SUB WS_TRACKBYTE(N,T,C,P) A=0 CALL A_TRACK(N,T,C,A) POKE A,P END SUB SUB RS_TRACKBYTE(N,T,C,P) A=0 CALL A_TRACK(N,T,C,A) P=PEEK(A) END SUB SUB WS_NOTE(N,T,P) A=0 CALL A_TRACK(N,T,0,A) POKE A,P END SUB SUB RS_NOTE(N,T,P) A=0 CALL A_TRACK(N,T,0,A) P=PEEK(A) END SUB SUB WS_TRACK(N,T,C,P) A=0 CALL A_TRACK(N,T,C\2+1,A) CALL WRITENIBBLE(A,C,P) END SUB SUB RS_TRACK(N,T,C,P) A=0 CALL A_TRACK(N,T,C\2+1,A) CALL READNIBBLE(A,C,P) END SUB SUB W_TRACK(N,T,P0,P1,P2,P3) A=0 CALL A_TRACK(N,T,1,A) CALL WRITENIBBLES(A,P0,P1) CALL WRITENIBBLES(A+1,P2,P3) END SUB SUB R_TRACK(N,T,P0,P1,P2,P3) A=0 CALL A_TRACK(N,T,1,A) CALL READNIBBLES(A,P0,P1) CALL READNIBBLES(A+1,P2,P3) END SUB 'T R A C K R E D I R E C T S SUB W_TRACKVOLUME(N,T,P) CALL WS_TRACK(N,T,0,P) END SUB SUB R_TRACKVOLUME(N,T,P) CALL RS_TRACK(N,T,0,P) END SUB SUB W_TRACKSYNTH(N,T,P) CALL WS_TRACK(N,T,1,P) END SUB SUB R_TRACKSYNTH(N,T,P) CALL RS_TRACK(N,T,1,P) END SUB SUB W_TRACKPARAMETER(N,T,P) CALL WS_TRACK(N,T,2,P) END SUB SUB R_TRACKPARAMETER(N,T,P) CALL RS_TRACK(N,T,2,P) END SUB SUB W_TRACKCOMMAND(N,T,P) CALL WS_TRACK(N,T,3,P) END SUB SUB R_TRACKCOMMAND(N,T,P) CALL RS_TRACK(N,T,3,P) END SUB 'S Y N T H S SUB A_SYNTH(N,O,A) A=SOUND_ADDRESS+N*8+O END SUB SUB W_SOUND(N,W,PW,LE) A=0 CALL A_SYNTH(N,0,A) POKE A,PW+W*16-(LE<>0)*64 POKE A+1,LE END SUB SUB R_SOUND(N,W,PW,LE,LEB) A=0 CALL A_SYNTH(N,0,A) P0=PEEK(A) PW=P0 MOD 16 W=(P0\16) MOD 4 LEB=(P0\64) MOD 2 LE=PEEK(A+1) END SUB SUB WS_SOUND(N,C,P) A=0 CALL A_SYNTH(N,0,A) IF C=0 THEN CALL WRITEBITS(A,0,4,P) 'POKE A,P + PEEK(A) AND %00001111 ELSE IF C=1 THEN CALL WRITEBITS(A,4,2,P) POKE A,P*16 + PEEK(A) AND %11110011 ELSE IF C=2 THEN CALL WRITEBIT(A,6,-(P<>0)) 'POKE A,-(P<>0)*64 + PEEK(A) AND %11111101 POKE A+1,P END IF END SUB SUB RS_SOUND(N,C,P) A=0 CALL A_SYNTH(N,0,A) IF C=0 THEN CALL READBITS(A,0,4,P) ELSE IF C=1 THEN CALL READBITS(A,4,2,P) ELSE IF C=2 THEN P=PEEK(A+1) ELSE IF C=3 THEN CALL READBIT(A,6,P) END IF END SUB SUB W_ENVELOPE(N,A,D,S,R) A0=0 CALL A_SYNTH(N,2,A0) CALL WRITENIBBLES(A0,A,D) CALL WRITENIBBLES(A0+1,S,R) END SUB SUB R_ENVELOPE(N,A,D,S,R) A0=0 CALL A_SYNTH(N,2,A0) CALL READNIBBLES(A0,A,D) CALL READNIBBLES(A0+1,S,R) END SUB SUB WS_ENVELOPE(N,C,P) A=0 CALL A_SYNTH(N,2,A) CALL WRITENIBBLE(A,C,P) END SUB SUB RS_ENVELOPE(N,C,P) A=0 CALL A_SYNTH(N,2,A) CALL READNIBBLE(A,C,P) END SUB SUB W_LFO(N,R,FR,VOL,PW) A=0 CALL A_SYNTH(N,5,A) CALL WRITENIBBLES(A,R,FR) CALL WRITENIBBLES(A+1,VOL,PW) END SUB SUB R_LFO(N,R,FR,VOL,PW) A=0 CALL A_SYNTH(N,5,A) CALL READNIBBLES(A,R,FR) CALL READNIBBLES(A+1,VOL,PW) END SUB SUB WS_LFO(N,C,P) A=0 CALL A_SYNTH(N,5,A) CALL WRITENIBBLE(A,C,P) END SUB SUB RS_LFO(N,C,P) A=0 CALL A_SYNTH(N,5,A) CALL READNIBBLE(A,C,P) END SUB SUB W_LFO_WAVE(N,W,I,E,T) A=0 CALL A_SYNTH(N,4,A) POKE A,W+I*4+E*8*T*16 END SUB SUB R_LFO_WAVE(N,W,I,E,T) A=0 CALL A_SYNTH(N,4,A) P0=PEEK(A) W=(P0) MOD 4 I=(P0\4) MOD 2 E=(P0\8) MOD 2 T=(P0\16) MOD 2 END SUB SUB WS_LFO_WAVE(N,C,P) A=0 CALL A_SYNTH(N,4,A) IF C=0 THEN CALL WRITEBITS(A,0,2,P) 'POKE A,P + PEEK(A) AND %00111111 ELSE IF C=1 THEN CALL WRITEBIT(A,2,P) 'POKE A,P*4 + PEEK(A) AND %11011111 ELSE IF C=2 THEN CALL WRITEBIT(A,3,P) 'POKE A,P*8 + PEEK(A) AND %11101111 ELSE IF C=3 THEN CALL WRITEBIT(A,4,P) 'POKE A,P*16 + PEEK(A) AND %11110111 END IF END SUB SUB RS_LFO_WAVE(N,C,P) A=0 CALL A_SYNTH(N,4,A) IF C=0 THEN CALL READBITS(A,0,2,P) ELSE IF C=1 THEN CALL READBIT(A,2,P) ELSE IF C=2 THEN CALL READBIT(A,3,P) ELSE IF C=3 THEN CALL READBIT(A,4,P) END IF END SUB 'S Y N T H R E D I R E C T S 'SOUND SUB W_PULSEWIDTH(N,P) CALL WS_SOUND(N,0,P) END SUB SUB R_PULSEWIDTH(N,P) CALL RS_SOUND(N,0,P) END SUB SUB W_VCOWAVE(N,P) CALL WS_TRACK(N,1,P) END SUB SUB R_VCOWAVE(N,P) CALL RS_TRACK(N,1,P) END SUB SUB W_LENGTH(N,P) CALL WS_TRACK(N,2,P) END SUB SUB R_LENGTH(N,P) CALL RS_TRACK(N,2,P) END SUB 'ENVELOPE SUB W_ATTACK(N,P) CALL WS_ENVELOPE(N,0,P) END SUB SUB R_ATTACK(N,P) CALL RS_ENVELOPE(N,0,P) END SUB SUB W_DECAY(N,P) CALL WS_ENVELOPE(N,1,P) END SUB SUB R_DECAY(N,P) CALL RS_ENVELOPE(N,1,P) END SUB SUB W_SUSTAIN(N,P) CALL WS_ENVELOPE(N,2,P) END SUB SUB R_SUSTAIN(N,P) CALL RS_ENVELOPE(N,2,P) END SUB SUB W_RELEASE(N,P) CALL WS_ENVELOPE(N,3,P) END SUB SUB R_RELEASE(N,P) CALL RS_ENVELOPE(N,3,P) END SUB 'LFO SUB W_LFORATE(N,P) CALL WS_LFO(N,0,P) END SUB SUB R_LFORATE(N,P) CALL RS_LFO(N,0,P) END SUB SUB W_FREQMOD(N,P) CALL WS_LFO(N,1,P) END SUB SUB R_FREQMOD(N,P) CALL RS_LFO(N,1,P) END SUB SUB W_VOLMOD(N,P) CALL WS_LFO(N,2,P) END SUB SUB R_VOLMOD(N,P) CALL RS_LFO(N,2,P) END SUB SUB W_PWMOD(N,P) CALL WS_LFO(N,3,P) END SUB SUB R_PWMOD(N,P) CALL RS_LFO(N,3,P) END SUB 'LFO WAVE SUB W_LFOWAVE(N,P) CALL WS_LFO_WAVE(N,0,P) END SUB SUB R_LFOWAVE(N,P) CALL RS_LFO_WAVE(N,0,P) END SUB SUB W_LFOINV(N,P) CALL WS_LFO_WAVE(N,1,P) END SUB SUB R_LFOINV(N,P) CALL RS_LFO_WAVE(N,1,P) END SUB SUB W_LFOENV(N,P) CALL WS_LFO_WAVE(N,2,P) END SUB SUB R_LFOENV(N,P) CALL RS_LFO_WAVE(N,2,P) END SUB SUB W_LFOTRIG(N,P) CALL WS_LFO_WAVE(N,3,P) END SUB SUB R_LFOTRIG(N,P) CALL RS_LFO_WAVE(N,3,P) END SUB 'R A M SUB COPYSYNTH(V,N) 'WHEN THE PARAMETERS ARE SET USING NX FUNCTIONS YOU CAN COPY THAT SYNTH TO THE MUSIC FILE COPY $FF44+V*12,8 TO SOUND_ADDRESS+N*8 END SUB SUB LOADSYNTH(V,N) 'LOAD SYNTH INTO A VOICE SO THAT YOU CAN PLAY IT (SIMILAR TO "PLAY V,P SOUND S") COPY SOUND_ADDRESS+N*8,8 TO $FF44+V*12 END SUB 'D I S K SUB SAVEMUSIC(F) SAVE F,"COOL MUSIC",SOUND_ADDRESS,6528 END SUB SUB LOADMUSIC(F) LOAD F,SOUND_ADDRESS END SUB 'B A C K E N D 'SUBPROGRAMS TO HANDLE INDUVIDUAL BITS SUB WRITENIBBLE(A,C,P) S=C MOD 2 POKE A,PEEK(A)AND (%1111 *(1-S)*16) + P*(S*15+1) END SUB SUB READNIBBLE(A,C,P) S=C MOD 2 P=(PEEK(A)AND (%1111 *S*16)) \ (S*15+1) END SUB SUB WRITENIBBLES(A,P0,P1) POKE A,P0+P1*16 END SUB SUB READNIBBLES(A,P0,P1) V=PEEK(A) P0=V MOD 16 P1=V/16 END SUB SUB WRITEBITS(A,S,N,P) '%11000000 AND '%11111100 EQUALS '%00111100 M=2^S-1 AND 2^(S+N-1)-1 POKE A,PEEK(A) AND M + P*2^S END SUB SUB READBITS(A,S,N,P) P=(PEEK(A)\2^S) MOD 2^N END SUB SUB WRITEBIT(A,S,P) M=%11111111-2^S 'M=%01111111*2^S 'M=2^S-1 AND 2^(S+1)-1 POKE A,PEEK(A) AND M + P*2^S END SUB SUB READBIT(A,S,P) P=(PEEK(A)\2^S) MOD 2 END SUB 'TRASH SUB OLDWRITETRACKVAL(N,T,C,P) 'NOTE: HIDDEN +1 IN 385 A=SOUND_ADDRESS+385+N*96+T*3+C\2 S=(C MOD 2)*15+1 Q=((C+1) MOD 2)*15+1 'POKE A,(PEEK(A)\Q MOD 16)*Q+P*S POKE A,PEEK(A)AND + P*S END SUB