**************************************************************** * * Init Sound DOC * **************************************************************** ProDOS gequ $e100a8 longa on longi on InitSound START ReggaeMan Using InstDef Using PictureBuffer Using SequenceNotes Using SeqEffects1 Using SeqEffects2 ldx #$00 lda #$8080 bcle sta >WaveBuffer,x ; 256 bytes buffer inx inx cpx #256 bne bcle sei PushLong #WaveBuffer ; Copy to DOC ram 256 $80 bytes PushWord #0 ; to make sure that there are no PushWord #256 ; $00 bytes that would stop the _WriteRamBlock ; oscilator. sep #$20 longa off bcleWait lda >$E1C03C bmi bcleWait ora #%00100000 and #%10111111 sta >$E1C03C lda #$40 sta >$E1C03E ; Set Volume Registers ldy #0 lda #0 ; Volume=0 bcleWrite1 sta >$E1C03D iny cpy #30 bne bcleWrite1 lda #$80 sta >$E1C03E ; Set Wavetable Pointer Registers ldy #0 lda #0 ; Wavetable Pointer register=0 bcleWrite2 sta >$E1C03D iny cpy #30 bne bcleWrite2 lda #$A0 sta >$E1C03E ; Set Control Registers ldy #0 bcleWrite3 lda #1 ; Control Byte=1 (osc. stopped) sta >$E1C03D iny cpy #30 bne bcleWrite3 lda #$C0 sta >$E1C03E ; Set Wavetable Size Registers ldy #0 bcleWrite4 lda #0 ; Size=0 sta >$E1C03D iny cpy #30 bne bcleWrite4 lda #$00 sta >$E1C03E lda #$FA sta >$E1C03D ; Frequency low 0=$7D =50Hz lda #$20 sta >$E1C03E lda #$0 sta >$E1C03D ; Frequency high 0=0 lda #$E1 sta >$E1C03E lda #60 sta >$E1C03D ; 30 osc. enabled lda #$A0 sta >$E1C03E lda #$8 sta >$E1C03D ; Osc 0 generates interrupts rep #$20 longa on cli rts **************************************************************** * * Load Music * **************************************************************** LoadMusic ENTRY Using SequenceNotes Using SeqEffects1 Using SeqEffects2 Using InstDef PushLong #Parmblock PushWord #$2010 ; Open jsl GSOS jsl ProDOSErrJSL lda parmblock+2 sta parmblock2+2 sta parmblock3+2 sta parmblock4+2 sta parmblock5+2 sta parmblock6+2 sta parmblock7+2 PushLong #Parmblock2 PushWord #$2012 ; Read Header jsl GSOS jsl ProDOSErrJSL ldx #44 ldy #0 bcleSetVolume lda >HeaderBuffer,x sta VolumeTable,y iny iny txa clc adc #30 tax cmp #470 bcc bcleSetVolume ReadFile lda >HeaderBuffer+6 sta Length sta Length2 sta Length3 PushLong #Parmblock3 PushWord #$2012 ; Read Notes jsl GSOS jsl ProDOSErrJSL PushLong #Parmblock4 PushWord #$2012 ; Read Effects1 jsl GSOS jsl ProDOSErrJSL PushLong #Parmblock5 PushWord #$2012 ; Read Effects2 jsl GSOS jsl ProDOSErrJSL PushLong #Parmblock6 PushWord #$2012 ; Read Stereo jsl GSOS jsl ProDOSErrJSL PushLong #Parmblock7 PushWord #$2014 ; Close jsl GSOS jsl ProDOSErrJSL rts MSB OFF MusicPathname dc i2'MusicPNEnd-MusicPathName-2' dc c'1/PnP.Datas/PnP.sng' ;Song !!! MusicPNEnd anop parmblock dc i2'2' ds 2 ; ref_num dc i4'MusicPathname' ; pathname parmblock2 dc i2'4' ds 2 ; ref_num dc i4'HeaderBuffer' ; data_buffer dc i4'600' ; request_count ds 4 ; transfer_count parmblock3 dc i2'4' ds 2 ; ref_num dc i4'Notes' ; data_buffer Length dc i4'$0000' ; request_count ds 4 ; transfer_count parmblock4 dc i2'4' ds 2 ; ref_num dc i4'Effects1' ; data_buffer Length2 dc i4'$0000' ; request_count ds 4 ; transfer_count parmblock5 dc i2'4' ds 2 ; ref_num dc i4'Effects2' ; data_buffer Length3 dc i4'$0000' ; request_count ds 4 ; transfer_count parmblock6 dc i2'4' ds 2 ; ref_num dc i4'StereoTable' ; data_buffer dc i4'30' ; request_count ds 4 ; transfer_count parmblock7 dc i2'1' ds 2 LoadDOCFile anop PushLong #Parmblock8 PushWord #$2010 ; Open jsl GSOS jsl ProDOSErrJSL lda parmblock8+2 sta parmblock10+2 sta parmblock11+2 sta parmblock12+2 sta parmblock13+2 PushLong #Parmblock10 PushWord #$2012 ; Read Index jsl GSOS jsl ProDOSErrJSL PushLong #Parmblock11 PushWord #$2012 ; Read wbk jsl GSOS jsl ProDOSErrJSL WaveReadOk anop ldx InstIndex lda #0 bcleCalc cpx #0 beq EndCalc dex clc adc #92 bra bcleCalc EndCalc sta InstLength PushLong #Parmblock12 PushWord #$2012 ; Read Instruments jsl GSOS jsl ProDOSErrJSL PushLong #Parmblock13 PushWord #$2014 ; Close jsl GSOS jsl ProDOSErrJSL rts Write2DOC sei PushLong #WaveBuffer ; PicBuf Pushword #$000 ; doc start address PushWord #$FFFF ; byte count _WriteRamBlock cli rts InitSmith ENTRY phb phk plb jsr InitSound plb rtl LoadMusic2 ENTRY phb phk plb jsr LoadMusic plb rtl LoadMusic4 ENTRY phb phk plb jsr LoadDOCFile plb rtl WriteDOC2 ENTRY phb phk plb jsr Write2DOC plb rtl Play2 ENTRY phb phk plb jsr Play plb rtl **************************************************************** * * * Play the music * * * **************************************************************** Play anop PushLong #SoundIRQrtn _SetSoundMIRQV stz Timer lda >HeaderBuffer+8 sta Tempo lda >HeaderBuffer+470 and #%0000000011111111 sta NumberOfBlocks ; If NumberOfBlocks=0 beq SkipPlay ; do not play. stz NotePlayed stz BlockIndex lda >HeaderBuffer+472 and #%0000000011111111 asl a tax lda BlockTable,x sta NoteIndex lda #1 sta Performing SkipPlay rts FatalError ENTRY brk $0 brk $0 dc c'SoundS... error' DOCStr dc i2'DOCStrEnd-DOCStr-2' dc c'1/PnP.Datas/PnP.wbk' ; WaveBank !!! DOCStrEnd anop parmblock8 dc i2'2' ds 2 ; ref_num dc i4'DOCStr' ; pathname parmblock10 dc i2'4' ds 2 ; ref_num dc i4'InstIndex' ; data_buffer dc i4'$0002' ; request_count ds 4 ; transfer_count parmblock11 dc i2'4' ds 2 ; ref_num dc i4'WaveBuffer' ; data_buffer dc i4'$10000' ; request_count ds 4 ; transfer_count parmblock12 dc i2'4' ds 2 ; ref_num dc i4'Instrument1' ; data_buffer instlength dc i4'0000' ; request_count ds 4 ; transfer_count parmblock13 dc i2'1' ds 2 **************************************************************** * * * Sound IRQ routine (This routine is called 50 times/second) * * * **************************************************************** SoundIRQrtn anop longa off longi off phb phd rep #$30 lda >MyZP tcd sep #$30 phk plb lda Performing bne BcleWaitUn jmp Stopped BcleWaitUn anop lda >$E1C03C bmi BcleWaitUn and #%10011111 ; Disable auto-inc. and access DOC reg. sta >$E1C03C lda #$E0 sta >$E1C03E ; Read Interrupt register to find out lda >$E1C03D ; wich osc. generated the interrupt. lda >$E1C03D and #%01111111 sta >$E1C03D and #%00111110 ; If it is osc. #0 then it means that lsr a ; it is the 50Hz interrupt. beq TimerInterrupt clc ; If osc<>#0 then find wich pair of adc #$A0 ; osc. caused the interrupt. sta >$E1C03E ; Then we clear the interrupt bit lda >$E1C03D ; of the first osc. of that pair lda >$E1C03D ; and we launch the second one. bit #%00001000 ; This may be used in future versions beq Stopped ; of SoundSmith to allow instruments to and #%11111110 ; loop smoothly. sta >$E1C03D Stopped clc pld plb rtl TimerInterrupt lda Performing ; Performing is used to know if the bne WeCanPlay ; music must be played. Set Performing jmp EndInterrupt ; to 0/1 to stop/play the music. WeCanPlay stz Temporary ; Temporary contains the number of the ! ; track that is being processed. inc Timer lda Timer ; If Timer=Tempo, play the notes. cmp Tempo ; Else, handle Arpegiatto effects. beq PlayTracks jmp HandleEffects PlayTracks stz Timer ; resets the Timer NewTrack rep #$30 longa on longi on lda Temporary asl a tax lda ActiveTrkTable,x ; Look if the current track is active beq TrackActive ; (0=active, $FFFF=inactive) inc NoteIndex ; If the track is inactive, skip it. inc Temporary ; (You can save much processor time by lda Temporary ; disabling the unused tracks!) cmp #14 bne NewTrack jmp EndPlay ; When all 14 tracks have been played, ! ; exit TrackActive sep #$20 longa off ldx NoteIndex lda >Notes,x ; Reads the note to play. rep #$20 longa on and #%0000000011111111 beq NotValid cmp #128 ; If the value of the note is >=128, bcs NotValid ; then it means that it's a command. bra NoteFound NotValid inc NoteIndex ; Point to next note (x register still ! points to the current note) cmp #128 ; is it STP ? bne NotSTP sep #$20 longa off lda >$E1C03C ; disable auto-increment and #%10011111 sta >$E1C03C lda Temporary ; Stops the osc. pair used to play inc a ; the current track asl a sta OscNumber clc adc #$A0 sta >$E1C03E lda #$01 sta >$E1C03D ; Stop osc.a lda OscNumber clc adc #$A1 sta >$E1C03E lda #$01 sta >$E1C03D ; Stop osc.b NotACommand sep #$20 longa off inc Temporary ; Handle next track. lda Temporary cmp #14 beq NoMoreTracks jmp NewTrack NotSTP longa on cmp #129 ; is it NXT ? bne NotACommand lda #63 ; this will cause the player to jump sta NotePlayed ; to the next block when the line of ! ; notes is completed. bra NotACommand NoMoreTracks rep #$20 longa on jmp EndPlay NoteFound sta Semitone ; Save the note that we read. sep #$20 longa off lda >Effects1,x ; Read the sample number. If its value ldy Temporary ; is 0, we must use the sample played and #%11110000 ; last. bne ThereIsASample lda SampleTable,y ThereIsASample sta SampleTable,y ; Else, save the sample number. lsr a lsr a lsr a lsr a dec a ; Convert the sample number*64 into asl a ; an index to tables containing words. tay lda VolumeTable,y ; Get the volume of the sample, lsr a ; divide it by two, sta VolumeInt ; and save it for later. rep #$20 longa on lda >Effects1,x ; Read the effect and #%0000000000001111 bne NotArpegiatto ; If effect=0, its maybe an arpegiatto. lda >Effects2,x ; Read the value for the effect, sep #$20 longa off ldy Temporary ; and save it in this table. sta ArpegiattoTbl,y lda Semitone ; Save the note that will be modified sta ArpegeToneTbl,y ; by the arpegiatto. rep #$20 longa on jmp NoTempoChange NotArpegiatto pha ; Save the value of the effect. sep #$20 longa off ldy Temporary ; First, if the effect <> 0, we must lda #0 ; stop the arpegiatto effect on this sta ArpegiattoTbl,y ; track. rep #$20 longa on pla ; Recover the effect value. cmp #$03 ; Effect $3=set volume bne noVolChange lda >Effects2,x ; Read new volume and #%0000000011111111 lsr a sta VolumeInt ; and save it. ChangeVol lda Semitone ; If Semitone=0, it means that we must beq ChangeIt ; change the volume of a note that is jmp NoTempoChange ; being played. ChangeIt lda Temporary inc a asl a sta OscNumber sep #$20 longa off SetAutoInc lda >$E1C03C bmi SetAutoInc ora #%00100000 ; Auto-incrementation and #%10111111 sta >$E1C03C lda OscNumber clc adc #$40 sta >$E1C03E lda VolumeInt ; Set new volume sta >$E1C03D ; for osc.a sta >$E1C03D ; for osc.b rep #$20 longa on bra NoTempoChange NoVolChange cmp #$06 ; Effect $6=lower the volume bne NoVolChange2 lda >Effects2,x and #%0000000011111111 lsr a sta TempInterrupt lda VolumeInt sec sbc TempInterrupt bpl VolOk lda #0 VolOk sta VolumeInt jmp ChangeVol NoVolChange2 cmp #$05 ; Effect $5=Increase the volume bne NoVolChange3 lda >Effects2,x and #%0000000011111111 lsr a clc adc VolumeInt cmp #$80 bcc VolOk2 lda #$7F VolOk2 sta VolumeInt jmp ChangeVol NoVolChange3 cmp #$0F ; Effect $F=New tempo bne NoTempoChange lda >Effects2,x ; The tempo value uses only the lowest and #%0000000000001111 ; nibble (1-$F) sta Tempo NoTempoChange lda Semitone bne PlayIt inc NoteIndex jmp NotSTP PlayIt lda Temporary ; The 0-1 osc. pair is used to generate inc a ; interrupts. Therefore, the track 0 asl a ; uses the pair 2-3, etc. sta OscNumber sep #$20 longa off lda >$E1C03C and #%10011111 sta >$E1C03C lda OscNumber clc adc #$A0 sta >$E1C03E lda >$E1C03D lda >$E1C03D and #%11110111 ora #%00000001 sta >$E1C03D ; Stop even osc. lda OscNumber clc adc #$A1 sta >$E1C03E lda >$E1C03D lda >$E1C03D and #%11110111 ora #%00000001 sta >$E1C03D ; Stop odd osc. ldy Temporary lda SampleTable,y rep #$20 longa on and #%0000000011110000 lsr a lsr a lsr a lsr a dec a cmp InstIndex ; do not play instruments that have not bcc SampleExists ; been loaded. jmp IgnoreSample SampleExists sta CurrInstInt asl a tax lda >InstIndexTable,x ; Offset to the beginning of the instru- clc ; ment definition table. adc #32 ; Points to the first Wavelist of osc.a SearchingA tax lda >Instrument1,x and #%0000000011111111 cmp Semitone ; If Semitone < Topkey we use this bcs FoundWaveListA ; WaveList. Otherwise, we must try the txa ; next one. clc adc #6 bra SearchingA FoundWaveListA stx IndexInterrupt inx lda >Instrument1,x ; Read the size & adress of the wave for sta TempInterrupt ; osc.a inx inx lda >Instrument1,x ; Read mode byte for osc.a and #%0000000011111111 sta Temp2Interrupt lda StereoMode ; If StereoMode=zero, we use the Mode beq StereoOk ; byte for the channel stereo. lda Temp2Interrupt ; Otherwise, we must use StereoTable and #%0000000000001111 ; to find out what channel to use. sta Temp2Interrupt lda Temporary ; (0=right $FFFF=left) asl a tax lda StereoTable,x beq StereoOk lda Temp2Interrupt ora #%0000000000010000 sta Temp2Interrupt StereoOk lda IndexInterrupt ; Look for a WaveList starting with $7F SearchEndOfA tax ; The first WaveList for osc.b starts lda >Instrument1,x ; 6 bytes further. and #%0000000011111111 cmp #$7F beq FoundEndOfA txa clc adc #6 bra SearchEndOfA FoundEndOfA txa clc adc #6 SearchingB tax ; We repeat the operations for osc.b lda >Instrument1,x and #%0000000011111111 cmp Semitone bcs FoundWaveListB txa clc adc #6 bra SearchingB FoundWaveListB inx lda >Instrument1,x sta Temp3Interrupt inx inx lda >Instrument1,x and #%0000000011111111 sta Temp4Interrupt lda StereoMode beq StereoOk2 lda Temp4Interrupt and #%0000000000001111 sta Temp4Interrupt lda Temporary asl a tax lda StereoTable,x beq StereoOk2 lda Temp4Interrupt ora #%0000000000010000 sta Temp4Interrupt StereoOk2 lda Semitone ; Converts the semitone into a asl a ; frequence. tax lda >FreqTable,x sta TempFreqInt lda CurrInstInt asl a tax lda CompactTable,x ; If the instrument is compacted, tax ; the frequence must be divided by two. bcleFreq cpx #0 ; (If the instrument has been compacted beq EndBcleFreq ; twice, the frequence must be divided lsr TempFreqInt ; by four, etc.) dex bra bcleFreq EndBcleFreq lda #0 sep #$20 longa off bcleWait2 lda >$E1C03C bmi bcleWait2 ora #%00100000 ; Set auto-incrementation and #%10111111 sta >$E1C03C lda OscNumber sta >$E1C03E lda TempFreqInt sta >$E1C03D ; Frequency low even sta >$E1C03D ; Frequency low odd lda OscNumber clc adc #$20 sta >$E1C03E lda TempFreqInt+1 sta >$E1C03D ; Frequency high even sta >$E1C03D ; Frequency high odd lda OscNumber clc adc #$40 sta >$E1C03E lda VolumeInt tax lda VolumeTable2,x sta >$E1C03D ; Volume even sta >$E1C03D ; Volume odd lda OscNumber clc adc #$80 sta >$E1C03E lda TempInterrupt sta >$E1C03D ; Wave Adress even lda Temp3Interrupt sta >$E1C03D ; Wave Adress odd lda OscNumber clc adc #$C0 sta >$E1C03E lda TempInterrupt+1 sta >$E1C03D ; Wave Size even lda Temp3Interrupt+1 sta >$E1C03D ; Wave Size odd lda OscNumber clc adc #$A0 sta >$E1C03E lda Temp2Interrupt sta >$E1C03D ; Control register even lda Temp4Interrupt sta >$E1C03D ; Control register odd IgnoreSample rep #$20 longa on inc NoteIndex ; It's finished, we can go to the inc Temporary ; next track... lda Temporary cmp #14 beq EndPlay sep #$20 longa off jmp NewTrack longa on EndPlay inc NotePlayed ; Point to next line. lda NotePlayed ; If NotePlayed=64, we must play the cmp #64 ; next block. beq ReadNewBlock jmp EndInterrupt ReadNewBlock stz NotePlayed inc BlockIndex ; Check if the music is finished. ldx BlockIndex cpx NumberOfBlocks beq Finished lda >HeaderBuffer+472,x ; If it is not, find next block to play. and #%0000000011111111 sta BlockPlayed asl a tax lda BlockTable,x ; Compute new NoteIndex. sta NoteIndex bra EndInterrupt Finished lda #0 ; If it is finished, set Performing to sta Performing ; zero. lda Loop ; If Loop <> 0 start the song over again beq NoLoop lda >HeaderBuffer+470 and #%0000000011111111 sta NumberOfBlocks stz NotePlayed stz BlockIndex lda >HeaderBuffer+472 and #%0000000011111111 asl a tax lda BlockTable,x sta NoteIndex lda #1 sta Performing NoLoop sep #$30 ; Stop all the osc. longa off longi off bcleStopAll lda >$E1C03C bmi bcleStopAll and #%10011111 ; acces DOC registers and disable sta >$E1C03C ; auto-incrementation. lda #2 sta OscNumber bcleStopAll2 lda OscNumber clc adc #$A0 sta >$E1C03E lda #$01 sta >$E1C03D ; Stop even osc. lda OscNumber inc a clc adc #$A0 sta >$E1C03E lda #$01 sta >$E1C03D ; Stop odd osc. lda OscNumber clc adc #2 sta OscNumber cmp #30 bne bcleStopAll2 EndInterrupt sep #$30 longa off longi off pld plb clc rtl ; End of Interrupt routine. HandleEffects sep #$30 ; Handle Arpegiatto effects. longa off longi off stz Temporary bcleHandleArp ldy Temporary lda ArpegiattoTbl,y ; If 0, no arpegiatto. bne ThereIsAnArp jmp NoArpegiatto ThereIsAnArp lda Timer ; Timer modulo 6 cmp #6 TryAgain bcc StartArp sec sbc #6 bra TryAgain StartArp2 bne StartArp2 jmp NoArpegiatto StartArp cmp #1 ; The arpegiatto changes the beq Stage1 ; frequence of the note in function cmp #4 ; of the time. beq Stage1 ; When Timer=1 ou 4 the first nibble of cmp #2 ; the effect value is added to the beq Stage2 ; semitone of the played note. cmp #5 ; When Timer=2 ou 5 the second nibble of beq Stage2 ; the effect value is added to the ! ; semitone of the played note. Stage3 lda ArpegiattoTbl,y ; When Timer=3 the value of the first & and #%00001111 ; second nibbles of the effect value are sta TempInterrupt ; substracted from the semitone of the lda ArpegiattoTbl,y ; played note. lsr a lsr a lsr a lsr a clc adc TempInterrupt sta TempInterrupt lda ArpegeToneTbl,y sec sbc TempInterrupt sta ArpegeToneTbl,y ; save new semitone bra ModifieFreq Stage1 lda ArpegiattoTbl,y lsr a lsr a lsr a lsr a clc adc ArpegeToneTbl,y sta ArpegeToneTbl,y ; save new semitone bra ModifieFreq Stage2 lda ArpegiattoTbl,y and #%00001111 clc adc ArpegeToneTbl,y sta ArpegeToneTbl,y ; save new semitone ModifieFreq rep #$20 longa on and #%0000000011111111 ; Compute the new frequence. asl a tax lda >FreqTable,x sta TempFreqInt sep #$20 longa off ldy Temporary lda SampleTable,y rep #$20 longa on asl a tax lda CompactTable,x ; The frequency changes if the instru- tax ; ments is compacted. bcleFreq2 cpx #0 beq EndBcleFreq2 lsr TempFreqInt dex bra bcleFreq2 EndBcleFreq2 sep #$20 longa off lda Temporary inc a asl a sta OscNumber bcleWait3 lda >$E1C03C ; Update Frequency registers bmi bcleWait3 ora #%00100000 and #%10111111 sta >$E1C03C lda OscNumber sta >$E1C03E lda TempFreqInt sta >$E1C03D ; Frequency low even. sta >$E1C03D ; Frequency low odd. lda OscNumber clc adc #$20 sta >$E1C03E lda TempFreqInt+1 sta >$E1C03D ; Frequency high even. sta >$E1C03D ; Frequency high odd. NoArpegiatto inc Temporary lda Temporary cmp #14 beq Fini jmp bcleHandleArp Fini pld plb clc rtl longa on longi on SampleTable ds 14 ArpegiattoTbl ds 14 ArpegeToneTbl ds 14 OscNumber ds 2 DataBank ds 2 Temporary ds 2 Semitone ds 2 TempInterrupt ds 2 Temp2Interrupt ds 2 Temp3Interrupt ds 2 Temp4Interrupt ds 2 TempFreqInt ds 2 IndexInterrupt ds 2 VolumeInt ds 2 CurrInstInt ds 2 **************************************************************** * * GlobalDATA * **************************************************************** InstIndex ds 2 BlockIndex ds 2 NotePlayed ds 2 BlockPlayed ds 2 NoteIndex ds 2 Timer ds 2 Tempo ds 2 NumberOfBlocks ds 2 Performing ENTRY dc i2'0' Loop ENTRY dc i2'0' VolumeTable dc i2'255,255,255,220,100,255,105,175,255,255,255,255,255,255,255' CompactTable dc i2'0,0,0,0,0,0,0,0,0,0,0,0,0,0,0' ActiveTrkTable ds 14*2 StereoTable ds 14*2 StereoMode ds 2 VolumeTable2 dc i1'0,1,3,4,6,7,9,10,12,13,15,16,18,19,21,22,24,25,27,28' dc i1'30,31,33,34,36,37,39,40,42,43,45,46,48,49,51,52,54,55,57' dc i1'58,60,61,63,64,66,67,69,70,72,73,75,76,78,79,81,82,84,85' dc i1'87,88,90,91,93,94,96,97,99,100,102,103,105,106,108,109' dc i1'111,112,114,115,117,118,120,121,123,124,126,127,129,130' dc i1'132,133,135,136,138,139,141,142,144,145,147,148,150,151' dc i1'153,154,156,157,159,160,162,163,165,166,168,169,171,172' dc i1'174,175,177,178,180,181,183,184,186,187,189,190,192' BlockTable dc i2'0,896,1792,2688,3584,4480,5376,6272,7168,8064' dc i2'8960,9856,10752,11648,12544,13440,14336,15232,16128,17024' dc i2'17920,18816,19712,20608,21504,22400,23296,24192,25088,25984' dc i2'26880,27776,28672,29568,30464,31360,32256,33152,34048,34944' dc i2'35840,36736,37632,38528,39424,40320,41216,42112,43008,43904' dc i2'44800,45696,46592,47488,48384,49280,50176,51072,51968,52864' dc i2'53760,54656,55552,56448,57344,58240,59136,60032,60928,61824' dc i2'62720,63616,64512' END **************************************************************** * * Some general use buffers * **************************************************************** Buffer2 DATA WaveBank WaveBuffer ENTRY ds $ffff END **************************************************************** * * Instdef: Instrument definition * **************************************************************** instdef DATA InstDefinition Instrument1 ENTRY dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 PriorityInc1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount1 dc i1'0' ; number of waveptrs for osc A BWaveCount1 dc i1'0' ; number of waveptrs for osc B WaveLists1 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument2 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount2 dc i1'0' ; number of waveptrs for osc A BWaveCount2 dc i1'0' ; number of waveptrs for osc B WaveLists2 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument3 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount3 dc i1'0' ; number of waveptrs for osc A BWaveCount3 dc i1'0' ; number of waveptrs for osc B WaveLists3 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument4 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount4 dc i1'0' ; number of waveptrs for osc A BWaveCount4 dc i1'0' ; number of waveptrs for osc B WaveLists4 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument5 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount5 dc i1'0' ; number of waveptrs for osc A BWaveCount5 dc i1'0' ; number of waveptrs for osc B WaveLists5 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument6 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount6 dc i1'0' ; number of waveptrs for osc A BWaveCount6 dc i1'0' ; number of waveptrs for osc B WaveLists6 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument7 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount7 dc i1'0' ; number of waveptrs for osc A BWaveCount7 dc i1'0' ; number of waveptrs for osc B WaveLists7 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument8 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount8 dc i1'0' ; number of waveptrs for osc A BWaveCount8 dc i1'0' ; number of waveptrs for osc B WaveLists8 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument9 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount9 dc i1'0' ; number of waveptrs for osc A BWaveCount9 dc i1'0' ; number of waveptrs for osc B WaveLists9 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument10 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount10 dc i1'0' ; number of waveptrs for osc A BWaveCount10 dc i1'0' ; number of waveptrs for osc B WaveLists10 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument11 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount11 dc i1'0' ; number of waveptrs for osc A BWaveCount11 dc i1'0' ; number of waveptrs for osc B WaveLists11 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument12 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount12 dc i1'0' ; number of waveptrs for osc A BWaveCount12 dc i1'0' ; number of waveptrs for osc B WaveLists12 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument13 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount13 dc i1'0' ; number of waveptrs for osc A BWaveCount13 dc i1'0' ; number of waveptrs for osc B WaveLists13 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument14 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount14 dc i1'0' ; number of waveptrs for osc A BWaveCount14 dc i1'0' ; number of waveptrs for osc B WaveLists14 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem Instrument15 dc i1'0,0,0' ; enveloppe dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' dc i1'0,0,0' ; fill out 8 stages with 0's dc i1'0' ; release segment - 1 dc i1'0' ; priority inc dc i1'0' ; pitch bend range dc i1'0' ; slight vibrato dc i1'0' ; vibrato speed dc i1'0' ; spare AWaveCount15 dc i1'0' ; number of waveptrs for osc A BWaveCount15 dc i1'0' ; number of waveptrs for osc B WaveLists15 dc i1'0,0,0,0,0,0' ; topkey,addr,size,ctrl,pitch dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem this size supports dc i1'0,0,0,0,0,0' ; idem up to 5 wave lists dc i1'0,0,0,0,0,0' ; idem for each wave. dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem dc i1'0,0,0,0,0,0' ; idem InstIndexTable dc i2'0,92,184,276,368,460,552,644,736,828,920,1012,1104,1196,1288,1380' FreqTable dc i2'$00,$16,$17,$18,$1A,$1B,$1D,$1E,$20,$22,$24,$26' ; Octave 0 dc i2'$29,$2B,$2E,$31,$33,$36,$3A,$3D,$41,$45,$49,$4D' ; Octave 1 dc i2'$52,$56,$5C,$61,$67,$6D,$73,$7A,$81,$89,$91,$9A' ; Octave 2 dc i2'$0A3,$0AD,$0B7,$0C2,$0CE,$0D9,$0E6,$0F4,$102,$112,$122,$133' ; Octave 3 dc i2'$146,$15A,$16F,$184,$19B,$1B4,$1CE,$1E9,$206,$225,$246,$269' ; Octave 4 dc i2'$28D,$2B4,$2DD,$309,$337,$368,$39C,$3D3,$40D,$44A,$48C,$4D1' ; Octave 5 dc i2'$51A,$568,$5BA,$611,$66E,$6D0,$737,$7A5,$81A,$895,$918,$9A2' ; Octave 6 dc i2'$A35,$AD0,$B75,$C23,$CDC,$D9F,$E6F,$F4B,$1033,$112A,$122F,$1344' ; Octave 7 dc i2'$1469,$15A0,$16E9,$1846,$19B7,$1B3F,$1CDE,$1E95,$2066,$2254,$245E,2688' ; Octave 8 END ******************************************************************* * * * Memoire reservee au stockage des notes et effects du sequenceur * * * ******************************************************************* PictureBuffer DATA PictureSeg HeaderBuffer ENTRY ds 600 END SequenceNotes DATA NoteSeg Notes ENTRY ds 25000 ; ds 65408 ; =14*64*73 END SeqEffects1 DATA EffectsSeg1 Effects1 ENTRY ds 25000 ; ds 65408 END SeqEffects2 DATA EffectsSeg2 Effects2 ENTRY ds 25000 ; ds 65408 END