MIDI

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Vertex

Betreff: MIDI

BeitragDo, Jan 10, 2008 1:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich bei meinem aktuellen Projekt intensiv mit MIDI Dateien arbeite, habe ich dazu ein kleines Modul herausgebracht. Ich verstehe das MIDI Format/Protokoll selber noch nicht vollständig, aber es wird langsam ^^

Nebenbei arbeite ich an einer deutschen Dokumentation:
vertex.dreamfall.at/midi/midi.pdf
Ist aber nur im Anfangsstadium

Hier das Modul:
Vertex.MIDI 1.00 Beta

Es fehlt in erster Linie noch SystemExclusive Nachrichten sowie running status Events.

Hier ein kleines Beispiel, dass eine .mid Datei erzeugt mit einem Track. Das Stück ist von Linkin Park - wers kennt.
Code: [AUSKLAPPEN]
SuperStrict

Framework BRL.Blitz
Import Vertex.MIDI

Global MIDI   : TMIDI, ..
       Header : TMIDIHeader, ..
       Track  : TMIDITrack

MIDI = New TMIDI

Header = New TMIDIHeader
' 480 PPQN -> 480 Ticks / 1/4 Note
Header.TimeDevision = 480
MIDI.SetHeader(Header)

Track = New TMIDITrack

' DeltaTime   = 0
' Numerator   = 4
' Denominator = 2
' Metronome   = 24
' 32nds       = 8
Track.AddEvent(..
   TTimeSignature.Create(0, 4, 2, 24, 8) ..
)

' DeltaTime = 0
' MPQN      = 60000000/120 BPM
Track.AddEvent(..
   TSetTempo.Create(0, 500000) ..
)

Track.AddEvent(..
   TText.Create(0, TText.SEQUENCE_TRACK_NAME, ..
                "Linkin Park - In the end") ..
)

' DeltaTime, Channel, Note, Velocity
Track.AddEvent( TNoteOn.Create(    0, 0, 51, 127) )
Track.AddEvent( TNoteOn.Create(  480, 0, 58, 127) )
Track.AddEvent( TNoteOff.Create( 464, 0, 58,  64) )
Track.AddEvent( TNoteOn.Create(   16, 0, 58, 127) )
Track.AddEvent( TNoteOn.Create(  480, 0, 54, 127) )
Track.AddEvent( TNoteOff.Create( 464, 0, 51,  64) )
Track.AddEvent( TNoteOn.Create(   16, 0, 53, 127) )
Track.AddEvent( TNoteOff.Create( 464, 0, 53,  64) )
Track.AddEvent( TNoteOn.Create(   16, 0, 53, 127) )
Track.AddEvent( TNoteOff.Create( 464, 0, 53,  64) )
Track.AddEvent( TNoteOff.Create(   0, 0, 58,  64) )
Track.AddEvent( TNoteOn.Create(   16, 0, 53, 127) )
Track.AddEvent( TNoteOff.Create( 464, 0, 54,  64) )
Track.AddEvent( TNoteOff.Create(   0, 0, 53,  64) )
Track.AddEvent( TNoteOn.Create(   16, 0, 53, 127) )
Track.AddEvent( TNoteOn.Create(  240, 0, 54, 127) )
Track.AddEvent( TNoteOn.Create(  240, 0, 51, 127) )
Track.AddEvent( TNoteOn.Create(  480, 0, 58, 127) )
Track.AddEvent( TNoteOff.Create( 464, 0, 58,  64) )
Track.AddEvent( TNoteOn.Create(   16, 0, 58, 127) )
Track.AddEvent( TNoteOff.Create( 464, 0, 54,  64) )
Track.AddEvent( TNoteOff.Create(   0, 0, 51,  64) )
Track.AddEvent( TNoteOn.Create(   16, 0, 54, 127) )
Track.AddEvent( TNoteOff.Create(  16, 0, 53,  64) )
Track.AddEvent( TNoteOn.Create(  464, 0, 53, 127) )
Track.AddEvent( TNoteOff.Create( 464, 0, 53,  64) )
Track.AddEvent( TNoteOn.Create(   16, 0, 53, 127) )
Track.AddEvent( TNoteOff.Create( 464, 0, 53,  64) )
Track.AddEvent( TNoteOff.Create(   0, 0, 58,  64) )
Track.AddEvent( TNoteOn.Create(   16, 0, 53, 127) )
Track.AddEvent( TNoteOff.Create( 464, 0, 54,  64) )
Track.AddEvent( TNoteOff.Create(   0, 0, 53,  64) )
Track.AddEvent( TNoteOn.Create(   16, 0, 53, 127) )
Track.AddEvent( TNoteOn.Create(  240, 0, 54, 127) )
Track.AddEvent( TNoteOff.Create(1664, 0, 54,  64) )
Track.AddEvent( TNoteOff.Create(  32, 0, 53,  64) )

Track.AddEvent(..
   TEndOfTrack.Create(0) ..
)

MIDI.AddTrack(Track)
MIDI.Save("Linkin Park - In the end.mid")


Um sich die MIDI Events ausgeben zu lassen, kann man folgenden Code benutzen:
Code: [AUSKLAPPEN]
SuperStrict

Framework BRL.Blitz
Import Vertex.MIDI

Global MIDI   : TMIDI, ..
       Header : TMIDIHeader, ..
       Track  : TMIDITrack

Try
   MIDI = TMIDI.Load("Moby - Porcelain.mid")
   
   Header = MIDI.Header
   Header.Debug()
   DebugLog("")
   
   For Track = EachIn MIDI.Tracks
      Track.Debug()
      DebugLog("")
   Next
Catch Exception : Object
   WriteStdout("Error:~n " + Exception.ToString() + "~n")
End Try

End


Als Referenz nehme ich immer AnvilStudio

Ein weiteres geniales Programm ist Synthesia :
user posted image user posted image

mfg olli
vertex.dreamfall.at | GitHub
 

porcus

BeitragDo, Jan 10, 2008 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann das auch Midis abspielen?
Wäre für mich am meisten interessant.
*Account deaktiviert*

Vertex

BeitragDo, Jan 10, 2008 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider nicht. Dazu fehlt mir ganz einfach das Wissen, was welches Event genau bewirkt. Weiterhin weiß ich auch nicht, ob die Patches(also praktisch die .wav Dateien der einzelnen Instrumente) nicht irgendwo bei Roland o. ä. patentiert sind.

Allegro bietet vllt. das, was du suchst:
http://www.allegro.cc/manual/api/music-routines-(midi)/

http://prdownloads.sourceforge...p?download
in src/midi.c

MiniFMOD bietet zudem einen open source Player für XM Tracker Musik an. Ich pers. würde auch MIDI Lieder als Hintergrundmusik für Spiele einsetzen. Die XM Musikstücke klingen da bei weitem besser Smile
http://www.fmod.org/index.php/download

mfg olli
vertex.dreamfall.at | GitHub

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group