Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #COMPILE EXE
- #DIM NONE
- FUNCTION PBMAIN () AS LONG
- '************************************
- '* XM2ESF/oerg v0.057 *
- '************************************
- '
- ' Converts XM-format module music to
- ' Echo Stream Format
- '
- '
- ' (C) 2009, 2010, 2011 Oerg866
- '
- ' XM Splitter (C) 2007 Nineko
- '
- PRINT "XM2ESF - Convert XM to Echo Stream Format"
- PRINT ""
- PRINT "*** ALPHA VERSION 0.0.57a ***"
- PRINT ""
- PRINT "THIS PROGRAM IS FREEWARE!"
- PRINT ""
- PRINT "Copyright (C) 2011 Oerg866 Software, inc."
- PRINT ""
- IF COMMAND$ = "" THEN
- PRINT "usage: xm2esf <infile> <outfile>"
- END IF
- OPEN COMMAND$(1) FOR INPUT AS #1
- DIM xmfm&(1 TO 6)
- DIM xmpsg&(1 TO 3)
- DIM fm&
- DIM psg&
- tempo& = 7 ' Default tempo :P
- WHILE setting$ <> "[Instruments]"
- LINE INPUT #1, setting$
- IF MID$(setting$, 1, 1) <> "#" THEN
- SELECT CASE spleft(setting$)
- CASE "FILE"
- xm$ = param(setting$, 1)
- PRINT "XM File: " + xm$
- CASE "TYPE"
- SELECT CASE param(setting$, 1)
- CASE "BGM"
- filetype& = 1
- CASE "SFX"
- filetype& = 2
- END SELECT
- SELECT CASE param(setting$, 2)
- CASE "LOOP"
- esfloop& = 1
- IF filetype& = 2 THEN
- PRINT "Input file errorneously declares loop while being a SFX. File rejected."
- PRINT "Press any key!"
- WAITKEY$
- CLOSE
- EXIT FUNCTION
- END IF
- CASE "NOLOOP"
- esfloop& = 0
- END SELECT
- CASE "TEMPO"
- tempo& = VAL(param(setting$, 1))
- CASE "FM"
- fm& = VAL(param(setting$, 1))
- IF fm > 6 THEN
- PRINT "Declared more than 6 FM channels. Press any key!"
- WAITKEY$:CLOSE:EXIT FUNCTION
- END IF
- CASE "PSG"
- psg& = VAL(param(setting$, 1))
- IF psg& > 3 THEN
- PRINT "Declared more than 3 PSG channels. Press any key!"
- PRINT "Press any key!"
- WAITKEY$
- CLOSE
- EXIT FUNCTION
- END IF
- CASE "PCM"
- pcm& = 1
- IF fm& = 6 THEN
- PRINT "Input file errorneously declares PCM even though 6 FM channels are used"
- PRINT "Press any key!"
- WAITKEY$
- CLOSE
- EXIT FUNCTION
- END IF
- CASE "NOISE"
- noise& = VAL(param(setting$, 1))
- CASE "FM1"
- xmfm&(1) = VAL(param(setting$, 1))
- CASE "FM2"
- xmfm&(2) = VAL(param(setting$, 1))
- CASE "FM3"
- xmfm&(3) = VAL(param(setting$, 1))
- CASE "FM4"
- xmfm&(4) = VAL(param(setting$, 1))
- CASE "FM5"
- xmfm&(5) = VAL(param(setting$, 1))
- CASE "FM6"
- xmfm&(6) = VAL(param(setting$, 1))
- CASE "PCMC"
- xmpcm& = VAL(param(setting$,1))
- CASE "PSG1"
- xmpsg&(1) = VAL(param(setting$, 1))
- CASE "PSG2"
- xmpsg&(2) = VAL(param(setting$, 1))
- CASE "PSG3"
- xmpsg&(3) = VAL(param(setting$, 1))
- CASE "PSGN"
- xmnoise& = VAL(param(setting$, 1))
- CASE "NOISETYPE"
- noisetype& = VAL(param(setting$, 1))
- END SELECT
- END IF
- WEND
- s$ = "loadxm " + xm$
- PRINT "Shell step: " + s$
- SHELL s$
- 'INSTRUMENT ASSIGNMENTS
- DIM esfins&(1 TO 256)
- WHILE setting$ <> "[Pitch]"
- IF MID$(setting$,1,1) <> "#" THEN
- LINE INPUT #1, setting$
- esfins&(VAL(spleft(setting$))) = VAL("&H" + param(setting$,1))
- END IF
- WEND
- 'PITCH
- ' 123456 = FM
- ' 789 = PSG
- ' 11 = PCM
- ' 10 = NSE
- DIM pitch&(1 TO 11)
- WHILE setting$ <> "[Volume]"
- IF MID$(setting$,1,1) <> "#" THEN
- SELECT CASE spleft(setting$)
- CASE "FM1"
- pitch&(1) = VAL(param(setting$,1))
- CASE "FM2"
- pitch&(2) = VAL(param(setting$,1))
- CASE "FM3"
- pitch&(3) = VAL(param(setting$,1))
- CASE "FM4"
- pitch&(4) = VAL(param(setting$,1))
- CASE "FM5"
- pitch&(5) = VAL(param(setting$,1))
- CASE "FM6"
- pitch&(6) = VAL(param(setting$,1))
- CASE "PSG1"
- pitch&(7) = VAL(param(setting$,1))
- CASE "PSG2"
- pitch&(8) = VAL(param(setting$,1))
- CASE "PSG3"
- pitch&(9) = VAL(param(setting$,1))
- END SELECT
- END IF
- WEND
- DIM pitch&(1 TO 11)
- WHILE setting$ <> "[END]"
- IF MID$(setting$,1,1) <> "#" THEN
- SELECT CASE spleft(setting$)
- CASE "FM1"
- vol&(1) = VAL(param(setting$,1))
- CASE "FM2"
- vol&(2) = VAL(param(setting$,1))
- CASE "FM3"
- vol&(3) = VAL(param(setting$,1))
- CASE "FM4"
- vol&(4) = VAL(param(setting$,1))
- CASE "FM5"
- vol&(5) = VAL(param(setting$,1))
- CASE "FM6"
- vol&(6) = VAL(param(setting$,1))
- CASE "PSG1"
- vol&(7) = VAL(param(setting$,1))
- CASE "PSG2"
- vol&(8) = VAL(param(setting$,1))
- CASE "PSG3"
- vol&(9) = VAL(param(setting$,1))
- CASE "PSG3"
- vol&(9) = VAL(param(setting$,1))
- CASE "PSGN"
- vol&(10) = VAL(param(setting$,1))
- END SELECT
- END IF
- WEND
- '
- CLOSE
- OPEN COMMAND$(2) FOR BINARY AS #20
- DIM i AS INTEGER
- DIM present&(1 TO 11)
- FOR i = 1 TO fm&
- present&(i) = 1
- OPEN "temp\C" + TRIM$(STR$(xmfm&(i))) + ".tmp" FOR BINARY AS #i
- NEXT i
- FOR i = 7 TO psg& + 6
- present&(i) = 1
- OPEN "temp\C" + TRIM$(STR$(xmpsg&(i-6))) + ".tmp" FOR BINARY AS #i
- NEXT i
- IF pcm& = 1 THEN
- present&(11) = 1
- OPEN "temp\C" + TRIM$(STR$(xmpcm&)) + ".tmp" FOR BINARY AS #11
- END IF
- IF noise& = 1 THEN
- present&(10) = 1
- OPEN "temp\C" + TRIM$(STR$(xmnoise&)) + ".tmp" FOR BINARY AS #10
- END IF
- ' $00nn ..... Note on FM channel #1
- ' $01nn ..... Note on FM channel #2
- ' $02nn ..... Note on FM channel #3
- ' $04nn ..... Note on FM channel #4
- ' $05nn ..... Note on FM channel #5
- ' $06nn ..... Note on FM channel #6
- ' $08nn ..... Note on PSG channel #1
- ' $09nn ..... Note on PSG channel #2
- ' $0Ann ..... Note on PSG channel #3
- ' $0Bnn ..... Note on PSG channel #4
- ' $0Cnn ..... Note on PCM channel
- '
- '
- DIM esfchan&(1 TO 11)
- esfchan&(1) = 0
- esfchan&(2) = 1
- esfchan&(3) = 2
- esfchan&(4) = 4
- esfchan&(5) = 5
- esfchan&(6) = 6
- esfchan&(7) = 8
- esfchan&(8) = 9
- esfchan&(9) = 10
- esfchan&(10) = 11
- esfchan&(11) = 12
- DIM fmnote&(1 TO 11)
- fmnote&(0) = 644
- fmnote&(1) = 681
- fmnote&(2) = 722
- fmnote&(3) = 765
- fmnote&(4) = 810
- fmnote&(5) = 858
- fmnote&(6) = 910
- fmnote&(7) = 964
- fmnote&(8) = 1024
- fmnote&(9) = 1081
- fmnote&(10) = 1146
- fmnote&(11) = 1214
- DIM psgnote&(0 TO 96)
- OPEN "psg.txt" FOR INPUT AS #1
- t&=0
- WHILE NOT EOF(1)
- LINE INPUT #1, c$
- psgnote&(t&) = VAL(c$)
- t&=t&+1
- WEND
- CLOSE #1
- ' freq& = INT(fmnote&(subtone&) * (2^octave&))
- DIM ctype(1 TO 11) AS INTEGER
- ctype(7) = 1
- ctype(8) = 1
- ctype(9) = 1
- ctype(10) = 2 'pcm
- ctype(11) = 3 'noise
- OPEN "temp\file.inf" FOR INPUT AS #1234
- LINE INPUT #1234, a$
- LINE INPUT #1234, a$: restart& = VAL(a$)
- LINE INPUT #1234, a$: total& = VAL(a$)
- CLOSE #1234
- DIM effectdat&(1 TO 11)
- DIM effectval&(1 TO 11)
- DIM row$(1 TO 11)
- FOR i = 1 TO 11
- row$(i) = " "
- effectdat&(i) = 255
- effectval&(i) = 255
- NEXT i
- DIM slidestep(1 TO 11) AS DOUBLE
- DIM slidetarget&(1 TO 11)
- DIM slidespeed&(1 TO 11)
- DIM volslidepos(1 TO 11) AS DOUBLE
- DIM slidespeed&(1 TO 11) AS DOUBLE
- DIM curins&(1 TO 11)
- DIM curnote&(1 TO 11)
- DIM curvol&(1 TO 11)
- DIM curfreq&(1 TO 9)
- DIM xmins&
- DIM currow AS LONG
- FOR currow = 1 TO total&
- IF currow = restart& THEN
- IF esfloop& = 1 THEN PUT$ #20, CHR$(&hFD)
- END IF
- FOR i = 1 TO 11
- IF present&(i) = 1 THEN
- GET #i, , row$(i)
- xmnote&= ASC(MID$(row$(i), 1, 1))
- xmins& = ASC(MID$(row$(i), 2, 1))
- xmvol& = ASC(MID$(row$(i), 3, 1))
- xmeff& = ASC(MID$(row$(i), 4, 1))
- xmeffdat& = ASC(MID$(row$(i), 5, 1))
- ' TEMP: Converting XM volume to FM volume (formula supplied by sik)
- '-(int(log10(x / 63.0) * 63))
- IF xmeff& = 3 THEN
- IF ctype(i) = 1 AND xmnote& <> 97 THEN
- slidetarget&(i) = xmnote& + pitch&(i)
- slidestep(i) = curnote&(i)
- slidespeed&(i) = xmeffdat&
- END IF
- END IF
- IF xmnote& < 97 AND xmnote& > 0 THEN IF xmeff& < 1 OR xmeff& > 3 THEN curnote&(i) = xmnote&
- IF xmeff& = 2 THEN
- slidestep(i) = curnote&(i)
- slidespeed&(i) = xmeffdat&
- sliDetarget&(i) = 0
- END IF
- IF xmnote& = 97 THEN
- PUT$ #20, CHR$(esfchan&(i))
- END IF
- IF xmnote& > 0 AND xmnote& < 97 THEN
- IF ctype(i) = 0 OR ctype(i) = 1 THEN
- SELECT CASE effEctdat&(i)
- CASE 1 TO 3
- EXIT IF
- END SELECT
- curnote&(i) = xmnote& + pitch&(i)
- 'instrument being 0 means that we play the note as if the instrument is the same
- IF curins&(i) <> xmins& THEN
- Curins&(i) = xmins&
- IF ctype(i) = 0 OR Ctype(i) = 1 THEN
- PUT$ #20, CHR$(&H40 + esfchan&(i))
- PUT$ #20, CHR$(esfins&(curins&(i)))
- END IF
- END IF
- IF ctype(i) = 0 THEN
- PUT$ #20, CHR$(esfchan&(i))
- PUT$ #20, CHR$(32 * INT(curnote&(i) / 12) + (2 * (curnote&(i) MOD 12)) + 1)
- ELSEIF ctype(i) = 1 THEN
- PUT$ #20, CHR$(esfchan&(i))
- PUT$ #20, CHR$(24 * INT(curnote&(i) / 12) + (2 * (curnote&(i) MOD 12)))
- END IF
- ELSEIF ctype(i) = 2
- curins&(i) = xmins&
- PUT$ #20, CHR$(esfchan&(i))
- PUT$ #20, CHR$(esfins&(curins&(i)))
- ELSEIF ctype(i) = 3
- IF curins&(i) <> xmins& THEN
- Curins&(i) = xmins&
- PUT$ #20, CHR$(&H40 + esfchan&(i))
- PUT$ #20, CHR$(esfins&(curins&(i)))
- END IF
- END IF
- END IF
- END IF
- IF xmeff& = &HC THEN
- IF ctype(i) = 0 THEN
- effectdat&(i) = &HC
- effectval&(i) = xmeffdat&
- PUT$ #20, CHR$(esfchan&(i) + &H20)
- PUT$ #20, CHR$(&h7f-(INT(LOG10(xmeffdat& / 63.0) * 63)))
- ELSEIF ctype(i)=1 THEN
- effectdat&(i)= &HC
- effectval&(i) = xmeffdat&
- PUT$ #20, CHR$(esfchan&(i) + &H20)
- PUT$ #20, CHR$(&h0f-(INT(LOG10(xmeffdat& / 15.0) * 15)))
- ELSE
- 'ignore for pcm +noise
- effectdat&(i) = 255
- effectval&(i) = 255
- END IF
- END IF
- END IF
- NEXT i
- FOR pf& = 1 TO tempo&
- ' PROCESS EFFECTS
- FOR i = 1 TO 11
- SELECT CASE effectdate&(cprocess&)
- CASE 1 TO 2
- IF ctype(i) <> 2 THEN
- IF effectdat&(cprocess&) slidestep(i) = slidestep(i) + slidespeed&(i) / 10
- IF slidetarget&(i) < slidestep(i) THEN slidestep(i) = slidetarget&(i)
- IF ctype(i)= 3 THEN
- PUT$ #20, CHR$(&h3A)
- ELSE
- PUT$ #20, CHR$(esfchan&(i) + &H30)
- END IF
- SELECT CASE ctype(i)
- CASE 0
- curfreq&(i) = INT(644*(2^(slidestep(i)/12)))
- PUT$ #20, CHR$(INT(curfreq&(i) / 256)) + CHR$(curfreq&(i) MOD 256)
- CASE 1 OR 2
- curfreq&(i) = INT((0.5^(slidestep(i)/12))/2*851)
- PUT$ #20, = CHR$(INT(curfreq&(i) MOD 16)) + CHR$(curfreq&(i) / 16)
- END SELECT
- END IF
- CASE 3
- slidestep(i) = slidestep(i) + slidespeed&(i) / 10
- IF slidetarget&(i) < slidestep(i) THEN slidestep(i) = slidetarget&(i)
- ' Note slide :D!
- IF ctype(i) = 0 THEN
- curfreq&(i) = INT(644*(2^(slidestep(i)/12)))
- PUT$ #20, CHR$(esfchan&(i) + &H30)
- PUT$ #20, CHR$(INT(curfreq&(i) / 256)) + CHR$(curfreq&(i) MOD 256)
- ELSEIF ctype(i) = 1 THEN
- curfreq&(i) = INT((0.5^(slidestep(i)/12))/2*851)
- PUT$ #20, CHR$(esfchan&(i) + &H30)
- PUT$ #20, CHR$(INT(curfreq&(i) MOD 16)) + CHR$(curfreq&(i) / 16)
- ELSEIF ctype(i) = 3 THEN
- IF noisetype& = 1
- curfreq&(i) = INT((0.5^(slidestep(i)/12))/2*851)
- PUT$ #20, = CHR$(&h3A) 'PSG Channel 3
- PUT$ #20, = CHR$(INT(curfreq&(i) MOD 16)) + CHR$(curfreq&(i) / 16)
- END IF
- ' Ignore this effect for anything else
- END IF
- END SELECT
- NEXT i
- PUT$ #20, CHR$(&HFE)
- PUT$ #20, CHR$(&H1)
- NEXT pf&
- NEXT currow
- IF esfloop& = 0 THEN PUT$ #20, CHR$(&hFF)
- PRINT "Conversion done!"
- CLOSE
- END FUNCTION
- ' freq& = INT(fmnote&(subtone&) * (2^octave&))
- ' b$ = CHR$(INT(freq& / 256)) + CHR$(freq& MOD 256)
- FUNCTION param(strn$, b&) AS STRING
- c& = 0
- i& = 1
- car$ = MID$(strn$, 1, 1)
- IF car$ = CHR$(34) THEN
- comp$ = CHR$(34)
- i& = 2
- car$ = MID$(strn$, 2, 1)
- ELSE
- comp$ = " "
- END IF
- WHILE c& <> b&
- WHILE car$ <> comp$
- SPEFT$ = SPEFT$ + car$
- i& = i& + 1
- car$ = MID$(strn$, i&, 1)
- IF i& > LEN(strn$) THEN
- SPEFT$ = ""
- param = SPEFT$
- EXIT FUNCTION
- END IF
- WEND
- i& = i& + 1
- c& = c& + 1
- ' SPEFT$ = MID$(strn$, i&, 1)
- car$ = SPEFT$
- WEND
- param = RTRIM$(spleft(MID$(strn$,i&)))
- END FUNCTION
- FUNCTION SPLEFT(strn$) AS STRING
- i& = 1
- car$ = MID$(strn$, 1, 1)
- IF car$ = CHR$(34) THEN
- comp$ = CHR$(34)
- i& = 2
- car$ = MID$(strn$, 2, 1)
- ELSE
- comp$ = " "
- END IF
- WHILE car$ <> comp$
- SPEFT$ = SPEFT$ + car$
- i& = i& + 1
- car$ = MID$(strn$, i&, 1)
- IF i& > LEN(strn$) THEN
- SPLEFT = SPEFT$ + cars$
- EXIT FUNCTION
- END IF
- WEND
- SPLEFT = SPEFT$
- END FUNCTION
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement