home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / Information / HACK5A.SFX / hack5-2 < prev    next >
Encoding:
Text File  |  1990-02-12  |  23.9 KB  |  801 lines

  1. WHEN IT'S VIEWED AS AN ALREADY ASSEMBLED 'MODULE'. ╘HE SECOND GOES THROUGH AN
  2. OVERVIEW OF THE MUSIC AND INSTRUMENT DATA FORMAT, AND IS GREAT FOR GETTING AN
  3. OVERALL FEEL FOR WHAT THE CODE IS DOING. ╘HE THIRD DESCRIPTION LOOKS AT THE
  4. VARIOUS SECTIONS OF THE CODE, AND HOW THEY COME TOGETHER.
  5.  
  6.  
  7. ╚OW TO USE THE SOURCECODE:
  8. *************************
  9.  
  10.     JSR    MUSIC+0 TO INITIALIZE THE MUSIC NUMBER IN THE ACCUMULATOR
  11.     JSR    MUSIC+3 TO PLAY THE MUSIC
  12.     JSR    MUSIC+6 TO STOP THE MUSIC AND QUIETEN ╙╔─
  13.  
  14.   ╘HE MUSIC IS SUPPOSED TO RUN AT 50╚Z, OR 50 TIMES PER SECOND. ╘HEREFORE
  15. ╨┴╠ USERS CAN RUN THE MUSIC ROUTINE OFF THE ╔╥╤ LIKE THIS:
  16.  
  17.     LDA    #$00     ; INIT MUSIC NUMBER 0
  18.     JSR    MUSIC+0
  19.     SEI             ; INSTALL THE IRQ AND A RASTER COMPARE
  20.     LDA    #<IRQ
  21.     LDX    #>IRQ
  22.     STA    $314
  23.     STX    $315
  24.     LDA    #$1B
  25.     STA    $D011
  26.     LDA    #$01
  27.     STA    $D01A
  28.     LDA    #$7F
  29.     STA    $DC0D
  30.     CLI
  31. LOOP =*
  32.     JMP    LOOP     ; ENDLESS LOOP (MUSIC IS NOW PLAYING OFF INTERRUPT :-)
  33.  
  34. IRQ =*
  35.     LDA    #$01
  36.     STA    $D019
  37.     LDA    #$3C
  38.     STA    $D012
  39.  
  40.     INC    $D020    ; PLAY MUSIC, AND SHOW A RASTER FOR THE TIME IT TAKES
  41.     JSR    MUSIC+3
  42.     DEC    $D020
  43.  
  44.     LDA    #$14
  45.     STA    $D018
  46.     JMP    $EA31
  47.  
  48.   ╔F THIS METHOD IS USED ON ╬╘╙├ MACHINES, THEN THE MUSIC WILL BE RUNNING AT
  49. 60╚Z AND WILL SOUND MUCH TO FAST - POSSIBLY IT MIGHT SOUND TERRIBLE. ╔'M
  50. AFRAID YOU'LL HAVE TO PUT UP WITH THIS UNLESS ┘╧╒ ARE GOOD ENOUGH TO MAKE A
  51. ├╔┴ INTERRUPT AT 50╚Z. ┴S ╔ HAVN'T HAD TO WORRY ABOUT ╬╘╙├ USERS BEFORE,
  52. PERHAPS SOMEONE WILL SEND ME THE BEST WAY TO DO THIS...
  53.  
  54. [┼D. ╬OTE: ┘OU COULD ALSO KEEP A COUNTER FOR THE ╔╥╤ AND DON'T EXECUTE IT
  55. EVERY 6 INTERRUPT. ╘HIS WILL MAKE IT THE RIGHT SPEED ALTHOUGH THE BEST
  56. SOLUTION IS FOR MODIFYING THE ├╔┴ TO 50╚Z LIKE HE MENTIONS ABOVE.]
  57.  
  58. ╚OW THE MUSIC DATA IS ARRANGED:
  59. ******************************
  60.  
  61. 1. ╘HE MUSIC 'MODULE' CONTAINS ONE OR MORE SONGS.
  62.  
  63.   ┼ACH ╥╚ MUSIC IS MADE UP OF A 'BUNCH' OF SONGS IN A SINGLE MODULE. ╘HUS
  64. THE 'MODULE' CAN HAVE THE TITLE MUSIC, IN-GAME MUSIC, AND THE GAME-OVER MUSIC
  65. ALL USING THE SAME PLAYROUTINE (AND EVEN THE SAME INSTRUMENTS :). ╘HE SOURCE
  66. THAT APPEARS BELOW ONLY HAS THE ONE SONG IN IT, AND THE MUSIC NUMBER IS
  67. AUTOMATICALLY SET TO 0 AS A RESULT (LINE 20). ╘HE LABEL 'SONGS' IS WHERE YOU
  68. WANT TO LOOK FOR THE POINTERS TO THE SONGS IF YOU WANT TO CHANGE THIS.
  69.  
  70. 2. ┼ACH SONG IS MADE UP OF THREE TRACKS.
  71.  
  72.   ╫E ALL KNOW THAT THERE ARE ONLY 3 CHANNELS ON THE ╙╔─ CHIP, SO THERE ARE
  73. ALSO 3 TRACKS - ONE FOR EACH CHANNEL. ╫HEN ╔ SAID 'POINTERS TO THE SONGS'
  74. ABOVE, ╔ WAS THEREFORE REFERRING TO 'POINTERS TO THE THREE TRACKS THAT MAKE UP
  75. THE SONG'...HENCE WE ARE LOOKING AT THE LABEL 'SONGS' AGAIN. ┼ACH TRACK NEEDS
  76. A HIGH AND LOW POINTER, SO THERE ARE 6 BYTES NEEDED TO POINT TO A SONG.
  77.  
  78. 3. ┼ACH TRACK IS MADE UP OF A LIST OF PATTERN NUMBERS
  79.  
  80.   ┼ACH TRACK CONSISTS OF A LIST OF THE PATTERN NUMBERS IN THE ORDER IN WHICH
  81. THEY ARE TO BE PLAYED. ╚ERE WE ARE LOOKING AT THE LABELS 'MONTYMAINTR1' AND
  82. 'MONTYMAINTR2'AND 'MONTYMAINTR3'. ╘HEREFORE ╔ CAN TELL YOU THAT THE INITIAL
  83. PATTERNS PLAYED IN THIS SONG ARE $11, $12 AND $13 ON CHANNELS 1,2 AND 3
  84. RESPECTIVELY. ╘HE TRACK IS EITHER ENDED WITH A $FF OR $FE BYTE. ┴ $FF MEANS
  85. THAT THE SONG NEEDS TO BE LOOPED WHEN THE END OF THE TRACK IS REACHED (LIKE
  86. THE MONTY MAIN TUNE), WHILE A $FE MEANS THAT THE SONG IS ONLY TO BE PLAYED
  87. ONCE. ╘HE CURRENT OFFSET INTO THE TRACK IS OFTEN CALLED THE CURRENT ╨╧╙╔╘╔╧╬
  88. FOR THAT TRACK.
  89.  
  90. 4. ┴ PATTERN CONSISTS OF A SEQUENCE OF NOTES.
  91.  
  92.   ┴ PATTERN CONTAINS THE DATA THAT SAYS WHEN THE NOTES SHOULD BE PLAYED, HOW
  93. LONG THEY SHOULD BE PLAYED FOR, AT WHAT PITCH, WITH WHAT INSTRUMENT, SHOULD
  94. THERE BE ┴─╙╥, SHOULD THERE BE BENDING (PORTAMENTO) OF THE NOTES ETC. ┼ACH
  95. PATTERN IS ENDED WITH A $FF BYTE, AND WHEN THIS IS ENCOUNTERED, THE NEXT
  96. PATTERN IN THE TRACK WILL BE PLAYED. ┼ACH NOTE HAS UP TO A 4 BYTE
  97. SPECIFICATION.
  98.  
  99. - ╘HE FIRST BYTE IS ALWAYS THE LENGTH OF THE NOTE FROM 0-31 OR 0-$1F IN HEX.
  100.   ┘OU WILL NOTICE THAT THE TOP THREE BITS ARE NOT USED FOR THE LENGTH OF THE
  101.   NOTE, SO THEY ARE USED FOR OTHER THINGS.
  102. - ┬IT#5 SIGNALS NO RELEASE NEEDED. - ┬IT#6 SIGNALS THAT THIS NOTE IS
  103.   APPENDED TO THE LAST ONE (NO ATTACK/ETC). - ┬IT#7 SIGNALS THAT A NEW
  104.   INSTRUMENT OR PORTAMENTO IS COMING UP.
  105.  
  106. - ╘HE SECOND BYTE IS AN OPTIONAL BYTE, AND IT HOLDS THE INSTUMENT NUMBER TO
  107.   USE OR THE PORTAMENTO VALUE (IE A BENDED NOTE). ╘HIS BYTE WILL BE NEEDED
  108.   ACCORDING TO WHETHER BIT#7 OF THE FIRST BYTE IS SET OR NOT...IE IF THE 1ST
  109.   BYTE WAS NEGATIVE, THEN THIS BYTE IS NEEDED.
  110.   - ╔F THE SECOND BYTE IS POSITIVE, THEN THIS IS THE NEW INSTRUMENT NUMBER.
  111.   - ╔F THE SECOND BYTE IS NEGATIVE, THEN THIS IS A BENDED NOTE (PORTAMENTO).
  112.     AND THE VALUE IS THE SPEED OF THE PORTAMENTO (EXCEPT FOR BITS #7 AND #0)
  113.     ┬IT #0 OF THE PORTAMENTO BYTE DETERMINES THE DIRECTION OF THE BEND.
  114.     - ┬IT#0 = 0 THEN PORTAMENTO IS UP.
  115.     - ┬IT#0 = 1 THEN PORTAMENTO IS DOWN.
  116.  
  117. - ╘HE THIRD BYTE OF THE SPECIFICATION IS THE PITCH OF THE NOTE. ┴ PITCH OF
  118.   0 IS THE LOWEST ├ POSSIBLE. ┴ PITCH OF 12 OR $├(HEX) IS THE NEXT HIGHEST
  119.   ├ ABOVE THAT. ╘HESE PITCHES ARE DENOTED FAIRLY UNIVERSALLY AS EG. '├-1' AND
  120.   FOR SHARPS EG. '─#3'. ╬OTICE THAT THIS ROUTINE USES PITCHES OF HIGHER THAN
  121.   72 ($48) WHICH IS C-6 :-)
  122.  
  123. - ╘HE FOURTH BYTE IF IT EXISTS WILL DENOTE THE END OF THE PATTERN.
  124.   IE. ╔F THE NEXT BYTE IS A $FF, THEN THIS IS THE END OF THE PATTERN.
  125.  
  126. ╬╧╘┼: ╔ HAVE LABELLED THE VARIOUS BYTES WITH NUMBERS FOR CONVENIENCE. ┬EAR
  127. IN MIND THAT SOME OF THESE ARE OPTIONAL, SO IF THE SECOND BYTE IS NOT NEEDED,
  128. THEN ╔ WILL SAY THAT THE PITCH OF THE NOTE COMING UP IS THE 'THIRD BYTE',
  129. EVEN THOUGH IT ISN'T REALLY.
  130.  
  131. ╧KAY, HERE ARE SOME EXAMPLES:
  132.  
  133. EG. $84,$04,$24 MEANS THAT THE LENGTH OF THE NOTE IS 4 (FROM THE LOWER 5 BITS
  134.     OF THE FIRST BYTE), THAT THE INSTRUMENT TO USE IS INSTRUMENT NUMBER 4
  135.     (THE SECOND BYTE, AS INDICATED BY BIT #7 OF THE FIRST BYTE), AND THAT THE
  136.     PITCH OF THE NOTE IS $24 OR C-3.
  137. EG. $─6,$98,$25,$╞╞ MEANS THAT THE LENGTH OF THE NOTE IS 22 ($16), THAT THIS
  138.     NOTE SHOULD BE APPENDED TO THE LAST, THAT THE SECOND BYTE IS A PORTAMENTO
  139.     (AS BOTH 1ST AND 2ND BYTES -VE!), THAT THE PORTAMENTO IS GOING UP (AS
  140.     BIT#0 = 0) WITH A SPEED OF 24 ($18), THAT THE PITCH OF THE NOTE IS $25
  141.     OR C#3, AND THAT THIS IS THE END OF THE PATTERN.
  142.  
  143. ╔T DOESN'T GET ANY HARDER THAN THAT!! ─ID YOU REALISE THAT THIS IS EXACTLY
  144. THE WAY THAT ╥OB ╚UBBARD MADE THE MUSIC!! ╚E WORKED OUT SOME MUSICAL IDEAS
  145. ON HIS CHEAP (MUSICAL) KEYBOARD, AND TYPED THE NOTES INTO HIS ASSEMBLER IN
  146. HEX, JUST LIKE THIS.
  147.  
  148.  
  149. 5. ╘HE INSTRUMENTS ARE AN 8 BYTE DATA STRUCTURE.
  150.  
  151.   ┘OU ARE LOOKING AT THE LABEL 'INSTR' AT THE BOTTOM OF THE SOURCECODE. ╘HE
  152. 8 BYTES WHICH COME ALONG FIRST ARE INSTRUMENT NUMNBER 0, THE NEXT 8 DEFINE
  153. INSTRUMENT NUMBER 1, ETC. ╚ERE ARE THE MEANINGS OF THE BYTES, BUT ╔ SUGGEST
  154. THAT YOU CHECK OUT YOUR PROGRAMMING MANUALS IF YOU ARE UNFAMILIAR WITH THESE:
  155.  
  156. - ┬YTE 0 IS THE PULSE WIDTH LOW BYTE, AND
  157. - ┬YTE 1 IS THE PULSE WIDTH HIGH BYTE. (ALSO SEE BYTE 7).
  158.  
  159. - ┬YTE 2 IS THE CONTROL REGISTER BYTE.
  160.   ╘HIS SPECIFIES WHICH TYPE OF SOUND SHOULD BE USED; SINE, SAWTOOTH ETC.
  161.  
  162. - ┬YTE 3 IS THE ATTACK AND DECAY VALUES, AND
  163. - ┬YTE 4 IS THE SUSTAIN AND RELEASE VALUES.
  164.   ╘HE NOTE'S VOLUME IS ALTERED ACCORDING TO THESE VALUES. ╫HEN THE ATTACK AND
  165.   DECAY ARE OVER, THE VOLUME OF THE NOTE IS HELD AT THE SUSTAIN LEVEL. ╫HEN
  166.   LENGTH OF A NOTE IS OVER, A RELEASE IS DONE THROUGH THE 'GATE' BIT IN ╙╔─.
  167.  
  168. - ┬YTE 5 IS THE VIBRATO DEPTH FOR THE INSTRUMENT.
  169.  
  170. - ┬YTE 6 IS THE PULSE SPEED.
  171.   ╘IMBRE IS CREATED BY CHANGING THE SHAPE OF THE WAVEFORM EACH 50TH OF A
  172.   SECOND, AND THIS IS THE MOST COMMON WAY OF ACHIEVING IT. ╘HE SHAPE OF
  173.   THE PULSE WAVEFORM CHANGES FROM SQUARE TO A VERY RECTANGULAR AT A SPEED
  174.   ACCORDING TO THIS BYTE.
  175.   ╬.┬. IF YOU ARE INTERESTED IN HOW THE PULSE VALUE NUMBER WORKS, THEN
  176.   E-MAIL ME SOMETIME, AS ╔ FOUND THIS OUT (EXHAUSTIVELY) A FEW DAYS AGO!
  177.  
  178. - ┬YTE 7 IS THE INSTRUMENT FX BYTE, AND IS THE MAJOR THING WHICH CHANGES
  179.   BETWEEN DIFFERENT MUSIC ROUTINES. ┼ACH BIT IN THIS BYTE DETERMINES WHETHER
  180.   THIS INSTRUMENT WILL HAVE A CERTAIN EFFECT IN IT.
  181.   - ┬IT#0 SIGNALS THAT THIS IS A DRUM. ─RUMS ARE MADE FROM A NOISE CHANNEL
  182.     AND ALSO A FAST FREQUENCY DOWN, WITH FAST DECAY. ┬ASS DRUMS USE A SQUARE
  183.     WAVE, AND ONLY THE FIRST 50TH OF A SECOND IS A NOISE CHANNEL. ╘HIS IS
  184.     THE TELL-TALE INSTRUMENT THAT GIVES AWAY A ╥OB ╚UBBARD ROUTINE! ╚IHATS
  185.     AND OTHER DRUMS USE NOISE ALL THE TIME.
  186.   - ┬IT#1 SIGNALS A 'SKYDIVE'. ╘HIS IS A SLOWER FREQUENCY DOWN, THAT ╔ THINK
  187.     SOUNDS LIKE SOMEBODY YELLING AS THEY FALL OUT OF A PLANE .. ┴╚╚╚╚HHHHGH..
  188.     ..HENCE ╔ CALL IT A SKYDIVE!!
  189.   - ┬IT#2 SIGNALS AN OCTAVE ARPEGGIO. ╔T'S A VERY LIMITED ARPEGGIO ROUTINE IN
  190.     THIS SONG. ╠ISTEN FOR THE ARPEGGIO AND THE SKYDIVE WHEN COMBINED, WHICH
  191.     IS USED ALOT IN ╚UBBARD SONGS.
  192.   - ┴LL THE OTHER BITS HAVE NO MEANING IN THIS MUSIC, BUT WERE USED ALOT IN
  193.     LATER MUSIC FOR THE FX.
  194.  
  195. ┴ BIG REASON THAT ╔ PRESENTED THIS EARLY ROUTINE, WAS BECAUSE THERE WAS NOT
  196. TOO MUCH IN THE WAY OF SPECIAL FX TO CONFUSE YOU. ┴S A RESULT, YOU CAN
  197. CONCENTRATE ON THE GUTS OF THE CODE INSTEAD OF THE SPECIAL FX :-)
  198.  
  199.  
  200. ╚OW THE SOURCECODE WORKS:
  201. ************************
  202.  
  203.   ╘HE ROUTINES AT THE TOP OF THE SOURCECODE ARE CONCERNED WITH TURNING THE
  204. MUSIC ON AND OFF, AND YOU WILL SEE THAT THIS IS DONE THROUGH A VARIABLE CALLED
  205. 'MSTATUS' (OR MUSIC STATUS). ╔F MSTATUS IS SET TO $├0, THEN THE MUSIC IS
  206. TURNED OFF AND ╙╔─ IS QUIETENED, THEREAFTER MSTATUS IS SET TO $80 WHICH MEANS
  207. THAT THE MUSIC IS STILL OFF, BUT ╙╔─ DOESN'T NEED TO BE QUIETENED AGAIN. ╫HEN
  208. THE MUSIC IS INITIALIZED, THEN MSTATUS IS GIVEN A VALUE OF $40 WHICH KICKS IN
  209. THE FURTHER INITIALIZATION STUFF. ╔F MSTATUS IS ANY OTHER VALUE, THEN THE
  210. MUSIC IS BEING PLAYED. ╞OR ANY OF THE INITIALIZATION STUFF TO HAVE ANY MEANING
  211. TO YOU, YOU OFCOURSE HAVE TO UNDERSTAND THE REST OF THE PLAYROUTINE :-)
  212.  
  213.   ┴FTER WE HAVE GOT PAST THE ON/OFF/INIT STUFF, WE ARE AT THE LABEL CALLED
  214. 'CONTPLAY' AT AROUND LINE 100. ╘HE FIRST THING YOU SHOULD NOTICE IS THAT THIS
  215. IS THE START OF A HUGE LOOP THAT IS DONE *3* TIMES - ONCE FOR EACH CHANNEL.
  216. ╘HE LOOP REALLY *IS* HUGE, AS IT ENDS RIGHT ON THE LAST FEW LINES OF THE CODE
  217. :-)
  218.  
  219.   ╬OW THAT WE ARE TALKING ABOUT ROUTINES WITHIN THE LOOP, WE ARE TALKING ABOUT
  220. THESE ROUTINES BEING APPLIED TO THE CHANNELS INDEPENDANTLY. ╘HERE ARE 2 MAIN
  221. ROUTINES WITHIN THE LOOP, ONE IS CALLED ╬OTE╫ORK, AND THE OTHER IS CALLED
  222. ╙OUND╫ORK. ╬OTE╫ORK CHECKS TO SEE WHETHER A NEW NOTE IS NEEDED ON THIS
  223. CHANNEL, AND IF IT IS, THEN THE NOTEDATA IS FETCHED AND STUFF IS INITIALIZED.
  224. ╔F NO NOTE IS NEEDED, THEN ╙OUND╫ORK IS CALLED WHICH PROCESSES THE INSTRUMENTS
  225. AND DOES THE PORTAMENTO.
  226.  
  227.   ╬OTE╫ORK FIRST CHECKS THE SPEED AT WHICH THE NOTES ARE FETCHED. ╔F THE DELAY
  228. IS STILL OCCURRING, THEN NEW NOTES ARE NOT NEEDED AND SOUNDWORK IS CALLED.
  229. ╬.┬. THAT THE SPEED FOR ═ONTY ON THE ╥UN IS 1, WHICH MEANS THAT A NOTE OF
  230. LENGTH $1F WILL LAST FOR 64 CALLS TO THE ROUTINE (IE JUST OVER A SECOND). ╔F
  231. THE SPEED OF THE SONG IS RESET, THEN ╬OTE╫ORK DECREMENTS THE LENGTH OF THE
  232. CURRENT NOTE. ╫HEN THE LENGTH OF THE CURRENT NOTE HITS $FF (-1) THEN A NEW
  233. NOTE IS NEEDED, OTHERWISE ╙OUND╫ORK IS JUMPED TO.
  234.  
  235.   ╘HE DATA FOR A NEW NOTE IS COLLECTED AT THE LABEL 'GETNEWNOTE'. ╔N THE
  236. SIMPLEST CASE, THIS INVOLVES GETTING THE NEXT BYTES OF DATA FROM THE CURRENT
  237. PATTERN ON THIS CHANNEL, BUT IF THE END OF THE PATTERN IS REACHED, THEN THE
  238. NEXT PATTERN NUMBER IS FETCHED BY REFERENCE TO THE CURRENT POSITION WITHIN
  239. THIS CHANNEL'S TRACK. ╔N AN EVEN MORE COMPLEX SITUATION, THE END OF A TRACK IS
  240. REACHED, AND THE CURRENT POSITION NEEDS TO BE RESET TO 0 BEFORE THE NEXT
  241. PATTERN NUMBER CAN BE FOUND.
  242.  
  243.   ┘OU CAN SEE QUITE CLEARLY IN THIS PART OF THE ROUTINE WHERE THE LENGTH OF
  244. THE NOTE IS COLLECTED, AND IT IS DETERMINED WHETHER A 2ND BYTE IS NEEDED,
  245. WHERE THE PITCH IS COLLECTED, AND THE END OF THE SONG CHECKED. ┘OU CAN ALSO
  246. SEE WHERE SOME OF THE DATA IS COLLECTED FROM THE CURRENT INSTRUMENT AND JAMMED
  247. INTO THE ╙╔─ REGISTERS.
  248.  
  249.   ╙OUND╫ORK IS CALLED IF NO NEW NOTES ARE NEEDED, AND IT PROCESSES THE
  250. INSTRUMENTS AND DOES THE PORTAMENTO ETC. ╘HIS PART OF THE ROUTINE IS NEATLY
  251. EXPRESSED IN SECTIONS WHICH ARE REALLY WELL COMMENTED AND QUITE EASY TO
  252. UNDERSTAND.
  253.  
  254. - ╘HE FIRST THING THAT OCCURS IN ╙OUND╫ORK IS THAT THE 'GATE BIT' OF ╙╔─ IS
  255.   SET WHEN THE LENGTH OF THE NOTE IS OVER - THIS CAUSES A RELEASE OF THE NOTE.
  256.  
  257. - ╘HE VIBRATO ROUTINE IS QUITE INEFFICIENT, BUT IT'S PRETTY GOOD FOR 1985!
  258.   ╧FCOURSE VIBRATO IS IMPLEMENTED BY RAISING AND LOWERING THE PITCH OF THE
  259.   NOTE EVER-SO-SLIGHTLY CAUSING THE NOTE TO 'FLOAT'. ╘HE AMOUNT OF THE
  260.   VIBRATO IS DETERMINED IN THE CURRENT INSTRUMENT.
  261.  
  262. - ╘HE PULSEWORK ROUTINE CHANGES THE PULSEWIDTH BETWEEN SQUARE WAVE AND VERY
  263.   RECTANGULAR WAVE ACCORDING TO THE PULSESPEED IN THE CURRENT INSTRUMENT.
  264.   (IE. IT CHANGES THE SOUND OF THE INSTRUMENT AND THUS ALTERS THE 'TIMBRE')
  265.   ╘HE ROUTINE GOES BACKWARDS AND FORWARDS BETWEEN THE TWO; AND SWITCHES
  266.   WHEN ONE EXTREMITY IS REACHED. ╔T'S INTERESTING TO NOTE THAT THE CURRENT
  267.   VALUES OF THE PULSE WIDTH ARE ACTUALLY STORED IN THE INSTRUMENT :-)
  268.  
  269. - ╨ORTAMENTO IS ACHIEVED BY ADDING/SUBTRACTING AN AMOUNT OF FREQUENCY TO
  270.   THE CURRENT FREQUENCY EACH TIME THIS PART OF THE ROUTINE IS CALLED.
  271.  
  272. - ╘HE INSTRUMENT FX ROUTINES ARE ALSO REALLY EASY TO FIGURE OUT, AS THEY ARE
  273.   WELL COMMENTED. ┬OTH THE DRUMS AND THE SKYDIVE DO A VERY FAST FREQUENCY
  274.   DOWN, SO IT IS THE MOST SIGNIFICANT BYTE OF THE FREQUENCY WHICH IS REDUCED
  275.   .. AND NOT 16-BIT MATHS (MATH?!) ╘HE ARPEGGIO IS ONLY AN OCTAVE ARPEGGIO,
  276.   SO FOR THE FIRST 50TH OF A SECOND, THE CURRENT NOTE IS PLAYED, AND FOR
  277.   THE NEXT 50TH OF A SECOND, CURRENT NOTE+12 IS PLAYED, FOLLOWED BY THE
  278.   CURRENT NOTE AGAIN ETC.
  279.   ( ╔F YOU DON'T KNOW WHAT AN ARPEGGIO IS..IT'S GENERALLY WHEN THE NOTES OF )
  280.   ( A CHORD ARE PLAYED INDIVIDUALLY IN A RAPID SUCCESSION. ╔T PRODUCES A    )
  281.   ( 'FULL' SOUND DEPENDING ON THE SPEED OF THE ARPEGGIO. ╔N MOST CASES THE  )
  282.   ( NOTE IS CHANGED 50 TIMES PER SECOND, WHICH GIVES A VERY NICE SOUND. ╔F  )
  283.   ( YOU HAVE LISTENED TO SOME COMPUTER MUSIC, THEN YOU WILL HAVE DEFINATELY )
  284.   ( LISTENED TO AN ARPEGGIOS ALL THE TIME, EVEN IF YOU DON'T REALIZE IT!    )
  285.  
  286.  
  287. ╞INAL ╘HOUGHTS:
  288. **************
  289.  
  290.   *┬OUNCE* ╔'M FINALLY NEAR THE END OF THIS ARTICLE! ╔T HAS BEEN ALOT OF WORK
  291. TO TRY TO EXPLAIN THIS ROUTINE, BUT ╔'M GLAD THAT ╔'VE DONE IT *GRIN* ╔F YOU
  292. HAVE ANY QUESTIONS THEN PLEASE FEEL FREE TO E-MAIL ME, OR EVEN E-MAIL ├RAIG IF
  293. IT'S AFTER ┴UGUST 1993 AND ╔'LL MAKE SURE THAT ╔ LEAVE A FORWARDING ADDRESS
  294. WITH HIM. ┴LSO, PLEASE FEEL FREE TO E-MAIL ME AND TELL ME WHAT YOU THINK OF
  295. THIS ARTICLE. ╔ WILL ONLY BE BOTHERED WRITING MORE OF THE SAME IF ╔ KNOW THAT
  296. SOMEONE IS FINDING THEM USEFUL/INTERESTING. ┴LSO E-MAIL ME IF YOU ARE
  297. INTERESTED IN ┴MIGA OR ╙╘ MUSIC TOO, AS ╔'VE DONE ALOT ON BOTH OF THOSE
  298. MACHINES.
  299.  
  300.   ╔'M NOT SURE WHETHER ├RAIG WILL BE PUTTING THE ACTUAL SOURCECODE BELOW THIS
  301. TEXT, OR IN SOME KIND OF ┴PPENDIX. ╔N EITHER CASE, ╔ ╙╚┴╠╠ TAKE ALL LEGAL
  302. RESPONSIBILTY FOR PUBLISHING ╥OB ╚UBBARD'S ROUTINE. ├RAIG WAS QUITE RELUCTANT
  303. TO PUBLISH THE ROUTINE IN HIS NET-MAG BECAUSE OF COPYRIGHT REASONS. ┴S A
  304. POST-GRADUATE LAW STUDENT THAT WILL BE WORKING AS A COMMERCIAL LAWYER
  305. (ATTOURNEY FOR ┴MERICANS :) SPECIALIZING IN COPYRIGHT/PATENTS FOR COMPUTER
  306. SOFTWARE/HARDWARE STARTING ┴UGUST THIS YEAR, ╔ DON'T BELIEVE THAT THERE ARE
  307. ANY PRACTICAL LEGAL CONSEQUENCES FOR ME.
  308.  
  309.   ╔ WOULD HAVE GIVEN AN ARM OR A LEG FOR A COMMENTED ╥OB ╚UBBARD SOURCECODE IN
  310. THE PAST, SO ╔ HOPE YOU ENJOY THIS VALUABLE OFFERING.
  311. -----------------------------------------------------------------------------
  312. ;ROB HUBBARD
  313. ;MONTY ON THE RUN MUSIC DRIVER
  314.  
  315. ;THIS PLAYER WAS USED (WITH SMALL MODS)
  316. ;FOR HIS FIRST APPROX 30 MUSIX
  317.  
  318. .ORG $8000
  319. .OBJ MOTR
  320.  
  321.  JMP INITMUSIC
  322.  JMP PLAYMUSIC
  323.  JMP MUSICOFF
  324.  
  325.  
  326. ;====================================
  327. ;INIT MUSIC
  328.  
  329. INITMUSIC =*
  330.  
  331.   LDA #$00         ;MUSIC NUM
  332.   LDY #$00
  333.   ASL
  334.   STA TEMPSTORE
  335.   ASL
  336.   CLC
  337.   ADC TEMPSTORE    ;NOW MUSIC NUM*6
  338.   TAX
  339.  
  340. - LDA SONGS,X      ;COPY PTRS TO THIS
  341.   STA CURRTRKHI,Y  ;MUSIC'S TRACKS TO
  342.   INX              ;CURRENT TRACKS
  343.   INY
  344.   CPY #$06
  345.   BNE -
  346.  
  347.   LDA #$00         ;CLEAR CONTROL REGS
  348.   STA $D404
  349.   STA $D40B
  350.   STA $D412
  351.   STA $D417
  352.  
  353.   LDA #$0F         ;FULL VOLUME
  354.   STA $D418
  355.  
  356.   LDA #$40         ;FLAG INIT MUSIC
  357.   STA MSTATUS
  358.  
  359.   RTS
  360.  
  361.  
  362. ;====================================
  363. ;MUSIC OFF
  364.  
  365. MUSICOFF =*
  366.  
  367.   LDA #$C0         ;FLAG MUSIC OFF
  368.   STA MSTATUS
  369.   RTS
  370.  
  371.  
  372. ;====================================
  373. ;PLAY MUSIC
  374.  
  375. PLAYMUSIC =*
  376.  
  377.   INC COUNTER
  378.  
  379.   BIT MSTATUS      ;TEST MUSIC STATUS
  380.   BMI MOFF         ;$80 AND $C0 IS OFF
  381.   BVC CONTPLAY     ;$40 INIT, ELSE PLAY
  382.  
  383.  
  384. ;==========
  385. ;INIT THE SONG (MSTATUS $40)
  386.  
  387.   LDA #$00         ;INIT COUNTER
  388.   STA COUNTER
  389.  
  390.   LDX #3-1
  391. - STA POSOFFSET,X  ;INIT POS OFFSETS
  392.   STA PATOFFSET,X  ;INIT PAT OFFSETS
  393.   STA LENGTHLEFT,X ;GET NOTE RIGHT AWAY
  394.   STA NOTENUM,X
  395.   DEX
  396.   BPL -
  397.  
  398.   STA MSTATUS      ;SIGNAL MUSIC PLAY
  399.   JMP CONTPLAY
  400.  
  401.  
  402. ;==========
  403. ;MUSIC IS OFF (MSTATUS $80 OR $C0)
  404.  
  405. MOFF =*
  406.  
  407.   BVC +            ;IF MSTATUS $C0 THEN
  408.   LDA #$00
  409.   STA $D404        ;KILL VOICE 1,2,3
  410.   STA $D40B        ;CONTROL REGISTERS
  411.   STA $D412
  412.  
  413.   LDA #$0F         ;FULL VOLUME STILL
  414.   STA $D418
  415.  
  416.   LDA #$80         ;FLAG NO NEED TO KILL
  417.   STA MSTATUS      ;SOUND NEXT TIME
  418.  
  419. + JMP MUSICEND     ;END
  420.  
  421.  
  422. ;==========
  423. ;MUSIC IS PLAYING (MSTATUS OTHERWISE)
  424.  
  425. CONTPLAY =*
  426.  
  427.   LDX #3-1         ;NUMBER OF CHANELS
  428.  
  429.   DEC SPEED        ;CHECK THE SPEED
  430.   BPL MAINLOOP
  431.  
  432.   LDA RESETSPD     ;RESET SPEED IF NEEDED
  433.   STA SPEED
  434.  
  435.  
  436. MAINLOOP =*
  437.  
  438.   LDA REGOFFSETS,X ;SAVE OFFSET TO REGS
  439.   STA TMPREGOFST   ;FOR THIS CHANNEL
  440.   TAY
  441.  
  442.  
  443. ;CHECK WHETHER A NEW NOTE IS NEEDED
  444.  
  445.   LDA SPEED        ;IF SPEED NOT RESET
  446.   CMP RESETSPD     ;THEN SKIP NOTEWORK
  447.   BEQ CHECKNEWNOTE
  448.   JMP VIBRATO
  449.  
  450. CHECKNEWNOTE =*
  451.  
  452.   LDA CURRTRKHI,X  ;PUT BASE ADDR.W OF
  453.   STA $02          ;THIS TRACK IN $2
  454.   LDA CURRTRKLO,X
  455.   STA $03
  456.  
  457.   DEC LENGTHLEFT,X ;CHECK WHETHER A NEW
  458.   BMI GETNEWNOTE   ;NOTE IS NEEDED
  459.  
  460.   JMP SOUNDWORK    ;NO NEW NOTE NEEDED
  461.  
  462.  
  463. ;==========
  464. ;NOTEWORK
  465. ;A NEW NOTE IS NEEDED. GET THE PATTERN
  466. ;NUMBER/CC FROM THIS POSITION
  467.  
  468. GETNEWNOTE =*
  469.  
  470.   LDY POSOFFSET,X  ;GET THE DATA FROM
  471.   LDA ($02),Y      ;THE CURRENT POSITION
  472.  
  473.   CMP #$FF         ;POS $FF RESTARTS
  474.   BEQ RESTART
  475.  
  476.   CMP #$FE         ;POS $FE STOPS MUSIC
  477.   BNE GETNOTEDATA  ;ON ALL CHANNELS
  478.   JMP MUSICEND
  479.  
  480. ;CC OF $FF RESTARTS THIS TRACK FROM THE
  481. ;FIRST POSITION
  482.  
  483. RESTART =*
  484.  
  485.   LDA #$00         ;GET NOTE IMMEDIATELY
  486.   STA LENGTHLEFT,X ;AND RESET PAT,POS
  487.   STA POSOFFSET,X
  488.   STA PATOFFSET,X
  489.   JMP GETNEWNOTE
  490.  
  491.  
  492. ;GET THE NOTE DATA FROM THIS PATTERN
  493.  
  494. GETNOTEDATA =*
  495.  
  496.   TAY
  497.   LDA PATPTL,Y     ;PUT BASE ADDR.W OF
  498.   STA $04          ;THE PATTERN IN $4
  499.   LDA PATPTH,Y
  500.   STA $05
  501.  
  502.   LDA #$00         ;DEFAULT NO PORTAMENTO
  503.   STA PORTAVAL,X
  504.  
  505.   LDY PATOFFSET,X  ;GET OFFSET INTO PTN
  506.  
  507.   LDA #$FF         ;DEFAULT NO APPEND
  508.   STA APPENDFL
  509.  
  510. ;1ST BYTE IS THE LENGTH OF THE NOTE 0-31
  511. ;BIT5 SIGNALS NO RELEASE (SEE SNDWORK)
  512. ;BIT6 SIGNALS APPENDED NOTE
  513. ;BIT7 SIGNALS A NEW INSTRUMENT
  514. ;     OR PORTAMENTO COMING UP
  515.  
  516.   LDA ($04),Y      ;GET LENGTH OF NOTE
  517.   STA SAVELNTHCC,X
  518.   STA TEMPLNTHCC
  519.   AND #$1F
  520.   STA LENGTHLEFT,X
  521.  
  522.   BIT TEMPLNTHCC   ;TEST FOR APPEND
  523.   BVS APPENDNOTE
  524.  
  525.   INC PATOFFSET,X  ;PT TO NEXT DATA
  526.  
  527.   LDA TEMPLNTHCC   ;2ND BYTE NEEDED?
  528.   BPL GETPITCH
  529.  
  530. ;2ND BYTE NEEDED AS 1ST BYTE NEGATIVE
  531. ;2ND BYTE IS THE INSTRUMENT NUMBER(+VE)
  532. ;OR PORTAMENTO SPEED(-VE)
  533.  
  534.   INY
  535.   LDA ($04),Y      ;GET INSTR/PORTAMENTO
  536.   BPL +
  537.  
  538.   STA PORTAVAL,X   ;SAVE PORTAMENTO VAL
  539.   JMP ++
  540.  
  541. + STA INSTRNR,X    ;SAVE INSTR NR
  542.  
  543. + INC PATOFFSET,X
  544.  
  545. ;3RD BYTE IS THE PITCH OF THE NOTE
  546. ;GET THE 'BASE FREQUENCY' HERE
  547.  
  548. GETPITCH =*
  549.  
  550.   INY
  551.   LDA ($04),Y      ;GET PITCH OF NOTE
  552.   STA NOTENUM,X
  553.   ASL              ;PITCH*2
  554.   TAY
  555.   LDA FREQUENZLO,Y ;SAVE THE APPROPRIATE
  556.   STA TEMPFREQ     ;BASE FREQUENCY
  557.   LDA FREQUENZHI,Y
  558.   LDY TMPREGOFST
  559.   STA $D401,Y
  560.   STA SAVEFREQHI,X
  561.   LDA TEMPFREQ
  562.   STA $D400,Y
  563.   STA SAVEFREQLO,X
  564.   JMP +
  565.  
  566. APPENDNOTE =*
  567.  
  568.   DEC APPENDFL     ;CLEVER EH?
  569.  
  570.  
  571. ;FETCH ALL THE INITIAL VALUES FROM THE
  572. ;INSTRUMENT DATA STRUCTURE
  573.  
  574. + LDY TMPREGOFST
  575.   LDA INSTRNR,X    ;INSTR NUM
  576.   STX TEMPSTORE
  577.   ASL              ;INSTR NUM*8
  578.   ASL
  579.   ASL
  580.   TAX
  581.  
  582.   LDA INSTR+2,X    ;GET CONTROL REG VAL
  583.   STA TEMPCTRL
  584.   LDA INSTR+2,X
  585.   AND APPENDFL     ;IMPLEMENT APPEND
  586.   STA $D404,Y
  587.  
  588.   LDA INSTR+0,X    ;GET PULSE WIDTH LO
  589.   STA $D402,Y
  590.  
  591.   LDA INSTR+1,X    ;GET PULSE WIDTH HI
  592.   STA $D403,Y
  593.  
  594.   LDA INSTR+3,X    ;GET ATTACK/DECAY
  595.   STA $D405,Y
  596.  
  597.   LDA INSTR+4,X    ;GET SUSTAIN/RELEASE
  598.   STA $D406,Y
  599.  
  600.   LDX TEMPSTORE    ;SAVE CONTROL REG VAL
  601.   LDA TEMPCTRL
  602.   STA VOICECTRL,X
  603.  
  604.  
  605. ;4TH BYTE CHECKS FOR THE END OF PATTERN
  606. ;IF EOP FOUND, INC THE POSITION AND
  607. ;RESET PATOFFSET FOR NEW PATTERN
  608.  
  609.   INC PATOFFSET,X  ;PREVIEW 4TH BYTE
  610.   LDY PATOFFSET,X
  611.   LDA ($04),Y
  612.  
  613.   CMP #$FF         ;CHECK FOR EOP
  614.   BNE +
  615.  
  616.   LDA #$00         ;END OF PAT REACHED
  617.   STA PATOFFSET,X  ;INC POSITION FOR
  618.   INC POSOFFSET,X  ;THE NEXT TIME
  619.  
  620. + JMP LOOPCONT
  621.  
  622.  
  623. ;==========
  624. ;SOUNDWORK
  625. ;THE INSTRUMENT AND EFFECTS PROCESSING
  626. ;ROUTINE WHEN NO NEW NOTE WAS NEEDED
  627.  
  628. SOUNDWORK =*
  629.  
  630. ;RELEASE ROUTINE
  631. ;SET OFF A RELEASE WHEN THE LENGTH OF
  632. ;THE NOTE IS EXCEEDED
  633. ;BIT4 OF THE 1ST NOTE-BYTE CAN SPECIFY
  634. ;FOR NO RELEASE
  635.  
  636.   LDY TMPREGOFST
  637.  
  638.   LDA SAVELNTHCC,X ;CHECK FOR NO RELEASE
  639.   AND #$20         ;SPECIFIED
  640.   BNE VIBRATO
  641.  
  642.   LDA LENGTHLEFT,X ;CHECK FOR LENGTH OF
  643.   BNE VIBRATO      ;EXCEEDED
  644.  
  645.   LDA VOICECTRL,X  ;LENGTH EXCEEDED SO
  646.   AND #$FE         ;START THE RELEASE
  647.   STA $D404,Y      ;AND KILL ADSR
  648.   LDA #$00
  649.   STA $D405,Y
  650.   STA $D406,Y
  651.  
  652.  
  653. ;VIBRATO ROUTINE
  654. ;(DOES ALOT OF WORK)
  655.  
  656. VIBRATO =*
  657.  
  658.   LDA INSTRNR,X    ;INSTR NUM
  659.   ASL
  660.   ASL
  661.   ASL              ;INSTR NUM*8
  662.   TAY
  663.   STY INSTNUMBY8   ;SAVE INSTR NUM*8
  664.  
  665.   LDA INSTR+7,Y    ;GET INSTR FX BYTE
  666.   STA INSTRFX
  667.  
  668.   LDA INSTR+6,Y    ;GET PULSE SPEED
  669.   STA PULSEVALUE
  670.  
  671.   LDA INSTR+5,Y    ;GET VIBRATO DEPTH
  672.   STA VIBRDEPTH
  673.   BEQ PULSEWORK    ;CHECK FOR NO VIBRATO
  674.  
  675.   LDA COUNTER      ;THIS IS CLEVER!!
  676.   AND #7           ;THE COUNTER'S TURNED
  677.   CMP #4           ;INTO AN OSCILLATING
  678.   BCC +            ;VALUE (01233210)
  679.   EOR #7
  680. + STA OSCILATVAL
  681.  
  682.   LDA NOTENUM,X    ;GET BASE NOTE
  683.   ASL              ;NOTE*2
  684.   TAY              ;GET DIFF BTW NOTE
  685.   SEC              ;AND NOTE+1 FREQUENCY
  686.   LDA FREQUENZLO+2,Y
  687.   SBC FREQUENZLO,Y
  688.   STA TMPVDIFLO
  689.   LDA FREQUENZHI+2,Y
  690.   SBC FREQUENZHI,Y
  691.  
  692. - LSR              ;DIVIDE DIFFERENCE BY
  693.   ROR TMPVDIFLO    ;2 FOR EACH VIBRDEPTH
  694.   DEC VIBRDEPTH
  695.   BPL -
  696.   STA TMPVDIFHI
  697.  
  698.   LDA FREQUENZLO,Y ;SAVE NOTE FREQUENCY
  699.   STA TMPVFRQLO
  700.   LDA FREQUENZHI,Y
  701.   STA TMPVFRQHI
  702.  
  703.   LDA SAVELNTHCC,X ;NO VIBRATO IF NOTE
  704.   AND #$1F         ;LENGTH LESS THAN 8
  705.   CMP #8
  706.   BCC +
  707.  
  708.   LDY OSCILATVAL
  709.  
  710. - DEY              ;DEPENDING ON THE OSC
  711.   BMI +            ;VALUE, ADD THE VIBR
  712.   CLC              ;FREQ THAT MANY TIMES
  713.   LDA TMPVFRQLO    ;TO THE BASE FREQ
  714.   ADC TMPVDIFLO
  715.   STA TMPVFRQLO
  716.   LDA TMPVFRQHI
  717.   ADC TMPVDIFHI
  718.   STA TMPVFRQHI
  719.   JMP -
  720.  
  721. + LDY TMPREGOFST   ;SAVE THE FINAL
  722.   LDA TMPVFRQLO    ;FREQUENCIES
  723.   STA $D400,Y
  724.   LDA TMPVFRQHI
  725.   STA $D401,Y
  726.  
  727.  
  728. ;PULSE-WIDTH TIMBRE ROUTINE
  729. ;DEPENDING ON THE CONTROL/SPEED BYTE IN
  730. ;THE INSTRUMENT DATASTRUCTURE, THE PULSE
  731. ;WIDTH IS OF COURSE INC/DECREMENTED TO
  732. ;PRODUCE TIMBRE
  733.  
  734. ;STRANGELY THE DELAY VALUE IS ALSO THE
  735. ;SIZE OF THE INC/DECREMENTS
  736.  
  737. PULSEWORK =*
  738.  
  739.   LDA PULSEVALUE   ;CHECK FOR PULSEWORK
  740.   BEQ PORTAMENTO   ;NEEDED THIS INSTR
  741.  
  742.   LDY INSTNUMBY8
  743.   AND #$1F
  744.   DEC PULSEDELAY,X ;PULSEDELAY-1
  745.   BPL PORTAMENTO
  746.  
  747.   STA PULSEDELAY,X ;RESET PULSEDELAY
  748.  
  749.   LDA PULSEVALUE   ;RESTRICT PULSE SPEED
  750.   AND #$E0         ;FROM $00-$1F
  751.   STA PULSESPEED
  752.  
  753.   LDA PULSEDIR,X   ;PULSEDIR 0 IS UP AND
  754.   BNE PULSEDOWN    ;1 IS DOWN
  755.  
  756.   LDA PULSESPEED   ;PULSE WIDTH UP
  757.   CLC
  758.   ADC INSTR+0,Y    ;ADD THE PULSESPEED
  759.   PHA              ;TO THE PULSE WIDTH
  760.   LDA INSTR+1,Y
  761.   ADC #$00
  762.   AND #$0F
  763.   PHA
  764.   CMP #$0E         ;GO PULSEDOWN WHEN
  765.   BNE DUMPULSE     ;THE PULSE VALUE
  766.   INC PULSEDIR,X   ;REACHES MAX ($0EXX)
  767.   JMP DUMPULSE
  768.  
  769. PULSEDOWN =*
  770.  
  771.   SEC              ;PULSE WIDTH DOWN
  772.   LDA INSTR+0,Y
  773.   SBC PULSESPEED   ;SUB THE PULSESPEED
  774.   PHA              ;FROM THE PULSE WIDTH
  775.   LDA INSTR+1,Y
  776.   SBC #$00
  777.   AND #$0F
  778.   PHA
  779.   CMP #$08         ;GO PULSEUP WHEN
  780.   BNE DUMPULSE     ;THE PULSE VALUE
  781.   DEC PULSEDIR,X   ;REACHES MIN ($08XX)
  782.  
  783. DUMPULSE =*
  784.  
  785.   STX TEMPSTORE    ;DUMP PULSE WIDTH TO
  786.   LDX TMPREGOFST   ;CHIP AND BACK INTO
  787.   PLA              ;THE INSTR DATA STR
  788.   STA INSTR+1,Y
  789.   STA $D403,X
  790.   PLA
  791.   STA INSTR+0,Y
  792.   STA $D402,X
  793.   LDX TEMPSTORE
  794.  
  795.  
  796. ;PORTAMENTO ROUTINE
  797. ;PORTAMENTO COMES FROM THE SECOND BYTE
  798. ;IF IT'S A NEGATIVE VALUE
  799.  
  800. PORTAMENTO =*
  801.