Hallo
DP,
ich habe / bin dabei ein Programm zu schreiben, was MIDIs öffnen kann, und diese letztlich durch einen Sampler (Bass.dll) abgespielt werden soll.
Das Programm hat 2 Features. Einmal direkt MIDI-IN (für Keyboard usw.) und einmal soll es halt MIDI-Files öffnen können (und auch dann abspielen)
Und genau beim Abspielen ist das Problem:
MIDI-IN (Komponente = siehe Anhang)
Code:
//Deklaration
MidiIn: TMidiInPut;
//Create (FormActivate)
MidiIn := TMidiInPut.Create(self);
MidiIn.OnMidiInput := MidiMessageIn;
//Code
procedure TForm1.MidiMessageIn(Sender: TObject);
var
Event: TMyMidiEvent;
temp:string;
ex: boolean;
vol: extended;
begin
Event := MidiIn.GetMidiEvent;
Inc(events);
Label4.Caption := IntToStr(events);
ex := False;
case Event.MidiMessage of
$80..$8F : begin
ex := true;
//Here be Dragons.. Or code..
end;
$90..$9F : begin
ex := mchans[Event.MidiMessage mod 16];
//
end;
else ex := false;
end;
if CheckBox2.Checked = True
then begin
if Event.Data1 < tbData1Min.Position then ex := True;
if Event.Data1 > tbData1Max.Position then ex := True;
end;
if ex = True then exit;
vol := Event.Data2 / 127;
try
case Event.Data1 of
12 : BassPlayer.PlaySound(path+'C0.WAV',vol);
13 : BassPlayer.PlaySound(path+'C#0.WAV',vol);
14 : BassPlayer.PlaySound(path+'D0.WAV',vol);
[...]
117 : BassPlayer.PlaySound(path+'A8.WAV',vol);
end;
finally
Event.Free;
end;
end;
Der Code funktioniert wunderbar, wenn ich über mein Keyboard MIDI Befehle reingebe (bzw über Loopmidi eine MIDI Datei reingebe) spielt er wunderbar ab.
http://soundcloud.com/magic94/monkey-island-1
Nun zum MIDI-File:
Code:
//Deklaration
MidiFile: TMidiFile;
//Create (FormActivate)
MidiFile := TMidiFile.Create(self);
MidiFile.OnMidiEvent := MidiMessageInFile;
//Laden
procedure TForm1.Button8Click(Sender: TObject);
begin
if OpenDialog1.Execute
then begin
MidiFile.Filename := OpenDialog1.Filename;
MidiFile.Readfile;
end;
end;
//Abspielen
procedure TForm1.Button9Click(Sender: TObject);
begin
MidiFile.StartPlaying;
end;
//Code
procedure TForm1.MidiMessageInFile(event: PMidiEvent);
var
temp:string;
ex: boolean;
vol: extended;
note: integer;
begin
Inc(events);
Label4.Caption := IntToStr(events);
ex := False;
case event^.event of
$80..$8F : begin
ex := true;
//Here be Dragons.. Or code..
end;
$90..$9F : begin
ex := mchans[event^.event mod 16];
//
end;
else ex := false;
end;
if CheckBox2.Checked = True
then begin
if Event^.Data1 < tbData1Min.Position then ex := True;
if Event^.Data1 > tbData1Max.Position then ex := True;
end;
if ex = True then exit;
vol := Event^.Data2 / 127;
try
note := Event^.data1;
case note of
12 : BassPlayer.PlaySound(path+'C0.WAV',vol);
13 : BassPlayer.PlaySound(path+'C#0.WAV',vol);
117 : BassPlayer.PlaySound(path+'A8.WAV',vol);
end;
finally
FreeMem(event);
end;
ListBox1.Items.Add(IntToStr(shit));
PlaySomething;
end;
procedure TForm1.PlaySomething; //Als Test
begin
BassPlayer.PlaySound(path+'C3.WAV',100);
end;
Leider versagt hierbei jetzt der BassPlayer. Kommentiere ich den Bassplayer aus, füllt er die Listbox am Ende des Code einfach mit den Zahlwerten. Lasse ich sie stehen, findet er aufeinmal das Sample nicht mehr.
Also ein durchlauf könnte so aussehen:
PlaySomething aufrufen (DING -> Sound hörbar)
MIDI öffnen und abspielen (Fehlermeldungssound hörbar, aber keine Fehlermeldung sichtbar)
PlaySomething wieder aufrufen (RUMS -> Sample nicht gefunden)
Und zum schluss noch den Bassplayer (siehe Anhang)
Danke für eure Hilfe
(Nutze Delphi 7 Personal)