Einzelnen Beitrag anzeigen

tvgcjpgnvid

Registriert seit: 27. Jul 2012
5 Beiträge
 
#1

Bass.dll kollidiert mit Midi Komponenten

  Alt 27. Jul 2012, 11:58
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)
Angehängte Dateien
Dateityp: zip MIDI-IN.zip (28,5 KB, 40x aufgerufen)
Dateityp: zip Basszeug.zip (125,7 KB, 34x aufgerufen)

Geändert von tvgcjpgnvid (27. Jul 2012 um 12:00 Uhr)
  Mit Zitat antworten Zitat