home *** CD-ROM | disk | FTP | other *** search
/ Set of Apple II Hard Drive Images / hard.hdv / HARD / MIDI2 / TEXT.TO.MIDI (.txt) < prev   
Encoding:
Applesoft BASIC Source Code  |  1990-12-08  |  3.7 KB  |  135 lines  |  [FC] Applesoft BASIC Program (0x0801)

  1. 0  REM   PROGRAM TO READ TEXT FILE AND CREATE A MIDI FILE
  2. 1  PRINT  CHR$(4)"BRUN EXTRA.VARIABLES"
  3. 2 S0 = 8192:SQ = S0: REM    ADRS OF SEQUENCE TO BE CREATED 
  4. 3 SU = 0: DIM SU$(50),ST(50),SE(50),D(32),C(32),N(32),V(32),A(32):V = 64
  5. 4  INPUT "TEXT FILE TO READ:";F$
  6. 5 C$ = "CDEFGABR#&WHQEST.+0123456cdefgabr#&whqest"
  7. 6  REM  GOTO 9 FOR TESTING
  8. 8  PRINT  CHR$(4)"VERIFY"F$: PRINT  CHR$(4)"OPEN"F$: PRINT  CHR$(4)"READ"F$
  9. 9  GOTO 1000
  10. 10  REM    SUBROUTINE TO FILL UNUSED TRACKS WITH NEW EVENTS
  11. 15  REM  GIVEN T=TRACK THAT NEEDS A NEW NOTE
  12. 100  GET A$: PRINT A$;
  13. 101  REM  TESTING: IF A$ = "" THEN  STOP
  14. 105  IF A$ = "<"  THEN  GOSUB 20000
  15. 106  IF A$ = "/"  OR A$ =  CHR$(13)  OR A$ = "*"  OR A$ = "]"  THEN 200
  16. 110  IF A$ =  CHR$(32)  THEN 100
  17. 130  IF A$ < >"["  THEN 140
  18. 132  GET A$
  19. 135  IF A$ < >"]"  AND A$ < >" "  AND A$ < > CHR$(13)  AND A$ < >"*"  THEN SU$ = SU$ +A$: GOTO 132
  20. 137 SU = SU +1:SU$(SU) = SU$:ST(SU) = SQ:SU$ = ""
  21. 139  GOTO 105
  22. 140  GOTO 150
  23. 150 F = 0: REM  TEST IF A$ IS IN C$
  24. 151  FOR I = 1 TO  LEN(C$)
  25. 152  IF A$ =  MID$ (C$,I,1)  THEN F = 1:I =  LEN(C$) +1
  26. 153  NEXT 
  27. 154  IF F = 0  THEN 160
  28. 155  IF  ASC(A$) > = 97  AND  ASC(A$) < = 122  THEN A$ =  CHR$( ASC(A$) -32)
  29. 156  REM  LINE 155 CONVERTS LOWER CASE TO UPPER CASE
  30. 157 N$ = N$ +A$
  31. 159  GOTO 100
  32. 160  IF A$ < >","  THEN 200
  33. 161 A0$ = A$:F = 0:FD = 0:D0 = 0
  34. 162  FOR I = 1 TO  LEN(N$):A$ =  MID$ (N$,I,1): IF F  THEN  GOTO 167
  35. 163 RE = 0: IF A$ = "R"  THEN F = 1:RE = 1: GOTO 190
  36. 164  IF (A$ > = "0")  AND (A$ < = "6")  THEN N = N - INT(N/12) *12 +( ASC(A$) - ASC("0")) *12 +24: GOTO 190
  37. 165  IF A$ > = "A"  AND A$ < = "G"  THEN N =  INT(N/12) *12 +(2 *(A$ = "D") +4 *(A$ = "E") +5 *(A$ = "F") +7 *(A$ = "G") +9 *(A$ = "A") +11 *(A$ = "B")):F = 1: GOTO 190
  38. 167  IF A$ = "#"  THEN N = N +1: GOTO 190
  39. 168  IF A$ = "&"  THEN N = N -1: GOTO 190
  40. 170  REM  PROCESS DURATIONS
  41. 174  IF FD  THEN 180
  42. 175  IF A$ = "B"  OR A$ = "W"  OR A$ = "H"  OR A$ = "Q"  OR A$ = "E"  OR A$ = "S"  OR A$ = "T"  OR A$ = "G"  THEN D = 15 *(A$ = "G") +30 *(A$ = "T") +60 *(A$ = "S") +120 *(A$ = "E") +240 *(A$ = "Q") +480 *(A$ = "H") +960 *(A$ = "W") +1920 *(A$ = "B"):FD = 1
  43. 177  GOTO 185
  44. 180  IF A$ = "."  THEN D = D *3/2
  45. 181  IF A$ = "T"  THEN D = D *2/3
  46. 182  IF A$ = "Q"  THEN D = D *4/5
  47. 185  IF A$ = "+"  THEN D0 = D0 +D:FD = 0
  48. 190  NEXT I
  49. 192 D0 = D0 +D:D = D0
  50. 195 N$ = ""
  51. 196  GOSUB 10000: REM  ASSIGN IT TO A FREE TRACK
  52. 197  IF A0$ = ","  THEN 100
  53. 198 A$ = A0$: GOTO 105
  54. 200  IF N$ < >""  THEN 161
  55. 205  IF A$ < >"*"  THEN 210
  56. 206  GET A$: IF A$ < > CHR$(13)  THEN 206
  57. 210  IF MT = 0  THEN 100
  58. 230 SQ = SQ -1: REM  NEW DURATION WILL OVERWRITE THE ZERO THAT WAS STORED FROM LINE 10000-
  59. 999  RETURN 
  60. 1000  REM    SET UP FIRST EVENT IN THE ARRAYS BEFORE GOING TO 1100
  61. 1004 SM = 0
  62. 1005  POKE SQ,0:SQ = SQ +1: REM  START WITH DELAY OF 0
  63. 1010  GOSUB 10: REM  PROCESS AN EVENT
  64. 1100  REM  STORE NOTES IN SEQUENCE
  65. 1101  REM  FIND SMALLEST OF ALL DURATIONS IN THE ARRAY, SUBTRACT IT FROM ALL DURS, IF =0, ADD A NOTE OFF TO THE SEQUENCE
  66. 1110 SM = 32768
  67. 1120  FOR I = 1 TO MT
  68. 1125  IF A(I) = 0  THEN 1140
  69. 1130  IF D(I) <SM  THEN SM = D(I)
  70. 1140  NEXT I
  71. 1142  IF SM = 32768  THEN  POKE SQ,0:SQ = SQ +1: GOTO 1240
  72. 1145  REM  POKE IN THE SM DELAY
  73. 1150  IF SM <128  THEN  POKE SQ,SM:SQ = SQ +1: GOTO 1200
  74. 1160  POKE SQ,128 + INT(SM/128)
  75. 1170  POKE SQ +1,SM - INT(SM/128) *128
  76. 1180 SQ = SQ +2
  77. 1190  REM  GENERATE NOTE OFFS
  78. 1200  FOR I = 1 TO MT
  79. 1205  IF A(I) = 0  THEN 1230
  80. 1210 D(I) = D(I) -SM
  81. 1220  IF D(I) < = 0  THEN A(I) = 0: POKE SQ,128: POKE SQ +1,N(I): POKE SQ +2,127: POKE SQ +3,0:SQ = SQ +4
  82. 1230  NEXT I
  83. 1240  IF A$ < >"]"  THEN 1250
  84. 1241 F = 0
  85. 1242  FOR J = SU TO 1  STEP  -1
  86. 1243  IF (F = 0)  AND SE(J) = 0  THEN F = 1:SE(J) = SQ -1
  87. 1244  NEXT J
  88. 1250  GOTO 1280
  89. 1280  GOSUB 10: REM  FILL UNUSED TRACKS WITH NEW EVENT
  90. 1500 DN = 1: REM   TRY TO PROVE NOT DONE
  91. 1510 DN = 0
  92. 1520  REM  TEST FOR DONENESS
  93. 1540  IF   NOT (DN)  THEN 1100
  94. 1550  PRINT : PRINT "DONE:"
  95. 1600  PRINT : PRINT "SEQUENCE STORED IN MEMORY"
  96. 1610  PRINT S0" - "SQ
  97. 1650  POKE 6,S0 - INT(S0/256) *256
  98. 1660  POKE 7, INT(S0/256)
  99. 1670  POKE 8,SQ - INT(SQ/256) *256
  100. 1680  POKE 9, INT(SQ/256)
  101. 1690  POKE 255,16: REM  TEMPO
  102. 1695  PRINT : PRINT 
  103. 1700  PRINT "TO HEAR IT - BLOAD MIDI.PLAYBACK AND": PRINT "CALL 768": PRINT : PRINT "TO SAVE IT : BSAVE <NAME>,A"SO",E"SQ
  104. 9999  END 
  105. 10000  REM  SUBROUTINE TO ASSIGN NEW NOTES TO TRACKS
  106. 10005  IF MT = 0  THEN MT = 1:FR = MT: GOTO 10050
  107. 10009 FR = 0
  108. 10010  FOR Q = 1 TO MT
  109. 10020  IF A(Q) = 0  THEN FR = Q:Q = MT +1
  110. 10030  NEXT Q
  111. 10040  IF FR = 0  THEN MT = MT +1:FR = MT
  112. 10050 N(FR) = N:D(FR) = D:C(FR) = 144:V(FR) = V:A(FR) = 1
  113. 10055  IF RE = 1  THEN N(FR) = 0:V(FR) = 0: REM   SPECIAL PROCESSING FOR RESTS  
  114. 10060  POKE SQ,C(FR): POKE SQ +1,N(FR): POKE SQ +2,V(FR):SQ = SQ +3
  115. 10070  POKE SQ,0:SQ = SQ +1
  116. 10080  REM  10070 WAS ADDED SO NOTES IN THE SAME EVENT OCCUR AT THE SAME TIME.  WHEN AN EVENT IS DONE, SUBTRACT 1 FROM SQ AND STORE THE CORRECT DURATION IN IT
  117. 10999  RETURN 
  118. 20000  REM  REPEATING PREVIOUSLY DEFINED SUBROUTINES
  119. 20010 SC$ = ""
  120. 20020  GET A$
  121. 20030  IF A$ = " "  OR A$ = ">"  OR A$ =  CHR$(13)  OR A$ = "*"  THEN 20040
  122. 20035 SC$ = SC$ +A$
  123. 20037  GOTO 20020
  124. 20040 F = 0: FOR J = 1 TO SU
  125. 20050  IF SC$ = SU$(J)  THEN F = J
  126. 20060  NEXT J
  127. 20070  IF F = 0  THEN 20999
  128. 20075  PRINT "COPYING SUBROUTINE: ";SU$(F)
  129. 20080  FOR K = ST(F) TO SE(F)
  130. 20090  POKE SQ, PEEK(K)
  131. 20095 SQ = SQ +1
  132. 20100  NEXT K
  133. 20800 A$ = "<"
  134. 20801  REM  TRICK SUBROUTINE INTO THINKING NOTHING HAPPENED HERE
  135. 20999  RETURN