Code archives/Audio/saving midi file

This code has been declared by its author to be Public Domain code.

Download source code

saving midi file by b322006
saves a 64 lines midi file
;--------------------------------
; TRACKER STYLE MIDI FILE OUTPUT
;--------------------------------
;        2006 Bram32bit
;          ver 3.01

;The MIDI file has a fixed size
;and writes only one pattern
;You cannot leave out notes without
;changing the size of the pattern


Dim Channel   (127)
Dim Instrument(127)

;number of tracks
NumTracks = 2

;setup channels/instruments pro track
Channel   (0) =  0    ;standard track
Instrument(0) =  8    ;celesta

Channel   (1) =  9    ;drum track
Instrument(1) =  0    ;unused

;general tempo
BPM = 120

;-------------------------------------------------------------------------------------------------
; 								     calculate tempo
;-------------------------------------------------------------------------------------------------

tt = 60000000 / BPM
t1 = (tt Shr 16)
t2 = (tt Shr 8) Mod 256
t3 = (tt Mod 256)

;opens file
Global MIDI_File = WriteFile("midifile.mid")

;-------------------------------------------------------------------------------------------------
;	  								 write MIDI header
;-------------------------------------------------------------------------------------------------

;[4] standard header
MIDI_WriteLine "MThd"

;[4] size header = 6 bytes
MIDI_WriteLine Chr$(0) + Chr$(0) + Chr$(0) + Chr$(6)

;[2] midi type 2 
MIDI_WriteLine Chr$(0) + Chr$(2)

;[2] number of tracks
MIDI_WriteLine Chr$(0) + Chr$(3)

;[2] time base 
MIDI_WriteLine Chr$($01) + Chr$($80)

;-------------------------------------------------------------------------------------------------
;										tempo track
;-------------------------------------------------------------------------------------------------

;[4] track header
MIDI_WriteLine "MTrk"

;[4] track length in bytes = 10 bytes
MIDI_WriteLine Chr$(0) + Chr$(0) + Chr$(0) + Chr$($0A)

;[8] tempo
MIDI_WriteLine Chr$(0) + Chr$(255) + Chr$(81) + Chr$(3) + Chr$(t1) + Chr$(t2) + Chr$(t3) + Chr$(0)

;[3] end of track
MIDI_WriteLine Chr$(255) + Chr$(47) + Chr$(0) 


For CurTrack = 0 To NumTracks - 1

;-------------------------------------------------------------------------------------------------
;									    track CurTrack
;-------------------------------------------------------------------------------------------------
;[4] track header
MIDI_WriteLine "MTrk"

;[4] track length in bytes 
MIDI_WriteLine Chr$(0) + Chr$(0) + Chr$(2) + Chr$(7) 

;[4] Channel: Program Change
MIDI_WriteLine Chr$(0) + Chr$($C0 + Channel(CurTrack)) + Chr$(Instrument(CurTrack)) + Chr$(0)

;-------------------------------------------------------------------------------------------------
;				 						write notes
;-------------------------------------------------------------------------------------------------

		For i = 0 To 63
			note = Rand(128)
			vol  = Rand(128)
			;[4] notes [status] [byte1] [byte2] [delta]
			;     on                           note    volume       time
			Send $90 + Channel(CurTrack): Send note: Send $64: Send $5C
			;    off                           note    volume       time
			Send $80 + Channel(CurTrack): Send note: Send $00: Send $04 * (i < 63)
		Next

;-------------------------------------------------------------------------------------------------
;										end of track
;-------------------------------------------------------------------------------------------------
;[3] end of track
MIDI_WriteLine Chr$(255) + Chr$(47) + Chr$(0) 

Next

;closes file
CloseFile MIDI_File

;-------------------------------------------------------------------------------------------------
;										testing MIDI
;-------------------------------------------------------------------------------------------------

;playback midi file
PlayMusic "midifile.mid"

WaitKey()
End

;-------------------------------------------------------------------------------------------------
;  										 FUNCTIONS
;-------------------------------------------------------------------------------------------------


;--------------
;MIDI_WRITELINE
;--------------

;sends a string to the file

Function MIDI_WriteLine( t$ )
	For i = 1 To Len( t$ )
		WriteByte MIDI_File, Asc(Mid$(t$, i, 1))
	Next
End Function


;-----
;SEND
;-----

;sends a byte to the file

Function Send( p )
	WriteByte MIDI_File, p
End Function


;-------------------------------------------------------------------------------------------------

Comments

Andres2006
Very cool. I was interested in this but didn't have enough patient to learn it. Thanks.


Panno2006
lol music on the fly ......


marcos jose2016
It runs normally on blitz, but does not work on windows media player.
"Corrupted file!"
How can I fix this?
Gracias!


_PJ_2016
http://www.ccarh.org/courses/253/handout/smf/


marcos jose2016
I'm sorry if this link has the answer to my question. But I could not find.
I'm already studying midi for a while. But for me it is very difficult without an instructor. Therefore, I did not understand that the above information would have directly with the error correction detected in the execution of the file by windows.
Suddenly I was not clear, since I am using a translator (Portuguese x English) from google.

The code works on the blitz.
It generates a file "midifile.mid".
This file does not play on windows media player.
Generates an error: "Corrupted file!".

Anyone who had this code-generated file managed to run it on windows media player without any problems?

I'm sorry, but my English is bad. So I do not know how to explain my doubt in a better way.


TomToad2016
Line 73 should read
format_code('MIDI_WriteLine Chr$(0) + Chr$(0) + Chr$(0) + Chr$($0B)')

Make that change and the file will open in Media Player.


marcos jose2016
Perfect!

It works on windows media player, and on my other players.

Thank you very much for your great help.
You do not know how happy I am with your simple but straightforward solution!

I hope the translator has managed to convey my satisfaction.
Once again, thank you!


Code Archives Forum