AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Bass.dll kollidiert mit Midi Komponenten
Thema durchsuchen
Ansicht
Themen-Optionen

Bass.dll kollidiert mit Midi Komponenten

Ein Thema von tvgcjpgnvid · begonnen am 27. Jul 2012 · letzter Beitrag vom 28. Jul 2012
Antwort Antwort
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
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Bass.dll kollidiert mit Midi Komponenten

  Alt 27. Jul 2012, 15:27
Wenn du schon Bass verwendest dann wäre es besser du verwendest auch das AddOn für MIDI zeugs
Dann kommst auch nicht in bedrängnis was die Midi Komponente angeht.

gruss
  Mit Zitat antworten Zitat
tvgcjpgnvid

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

AW: Bass.dll kollidiert mit Midi Komponenten

  Alt 27. Jul 2012, 17:08
Leider ist diese Komponente für die Verwaltung von Soundfonts gedacht, bzw das abspielen von Soundfonts. Wir brauchen aber die Rohen MIDI Daten.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Bass.dll kollidiert mit Midi Komponenten

  Alt 27. Jul 2012, 22:45
Kuck mal dieses Stückchen Code an:
Delphi-Quellcode:
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;
Ständige Wiederholungen von immer gleichem Code; das ist schlecht!
Mach' Dir eine Unterfunktion, die für jeden Midinote den Namen der Wav-Datei liefert:
Delphi-Quellcode:
function MidiNote2Wav(note:integer):string;
begin
  case note of
   12 : Result := 'C0.WAV';
   13 : Result := 'C#0.WAV';
   14 : result := 'D0.WAV';
      [...]
   117 : result := 'A8.WAV';
  end;
end;
Und dann baust du noch eine Prüfung ein ob die Datei überhaupt existiert:
Delphi-Quellcode:
procedure TForm1.MidiMessageInFile(event: PMidiEvent);
var
  temp:string;
  ex: boolean;
  vol: extended;
  note: integer;
  filename : string;
begin
  Inc(events);
  Label4.Caption := IntToStr(events);
...
  try
    note := Event^.data1;
    filename := path + MidiNote2Wav(note); // NEU
    if not FileExists(filename) then
      ShowMessageFmt('%s nicht vorhanden', [filename]);

    BassPlayer.PlaySound(filename,vol);
  finally
    FreeMem(event);
  end;
  ListBox1.Items.Add(IntToStr(shit));
  PlaySomething;
end;
  Mit Zitat antworten Zitat
tvgcjpgnvid

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

AW: Bass.dll kollidiert mit Midi Komponenten

  Alt 27. Jul 2012, 23:33
Ständige Wiederholungen von immer gleichem Code; das ist schlecht!
Mach' Dir eine Unterfunktion, die für jeden Midinote den Namen der Wav-Datei liefert:
Delphi-Quellcode:
function MidiNote2Wav(note:integer):string;
begin
  case note of
   12 : Result := 'C0.WAV';
   13 : Result := 'C#0.WAV';
   14 : result := 'D0.WAV';
      [...]
   117 : result := 'A8.WAV';
  end;
end;
Und dann baust du noch eine Prüfung ein ob die Datei überhaupt existiert:
Eine Unterfunktion macht doch im Endeffekt nichts anderes, und dabei noch einen Function-Call ... klingt langsamer.
Zudem das mit dem "normalen" Datei nicht vorhanden ja irgendwie nicht sein kann. Denn ich habe ja oben gepostet:

Fester Pfad, nichts zu rütteln.
Playsomething -> spielt etwas ab.
MIDI öffnen, auf Play klicken -> Fehlermeldungssounds erscheinen -> Stop.
Playsomething -> aufeinmal findet es die Datei nicht mehr...

Bei dem was du umgeschrieben hast würde er mir nur nochmal sagen das die Datei spurlos verschwunden ist.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Bass.dll kollidiert mit Midi Komponenten

  Alt 28. Jul 2012, 00:19
Ich frage dich noch einmal warum verwendest du denn Bibliotheken die nicht oder angeblich.. nicht funktionieren wie Bass.
Warum baut man sich so etwas ein nur um eine Wav-Datei abzuspielen das geht ganz einfach nur mit
einer funktion aus MMSystem unter verwendung von MCI.

PlaySound(path + 'C0.WAV', 0, SND_FILENAME Or SND_ASYNC);

Ok kein Volumen aber das läßt sich auch ganz schnell mit MCI implementieren.

Oder schau mal hier!
Nachbearbeitung meiner MCIPlayer Classe von Sir Rufo

Du mußt hier nur für die Guid für D7 zwei Dinge ändern..
Delphi-Quellcode:
constructor TMciPlayer.Create;
var
  NewGUID: TGUID;
 begin
   inherited Create;

   FState := mpsClosed;
   CreateGUID(NewGUID);
   FAlias := GUIDToString( NewGUID );
   FFileName := '';
   FDuration := 0;
 end;

Entweder oder (MIDI mit MCI) oder (BASS mit dem dazugehörigen MIDI AddON).
Was anderes fällt mir jetzt auch nicht ein.

bla.. bla .. bla

gruss

Geändert von EWeiss (28. Jul 2012 um 01:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Bass.dll kollidiert mit Midi Komponenten

  Alt 28. Jul 2012, 01:04
Eine Unterfunktion macht doch im Endeffekt nichts anderes, und dabei noch einen Function-Call ... klingt langsamer.
Man verliert wenige Mikrosekunden aber man verbessert die Struktur der Software.
Eine der wichtigsten Grundprinzipien der Softwareentwicklung nennt sich "Don't Repeat Yourself"
Es muss dir doch auffallen, dass grosse Abschnitte deines Codes aus ständigen Wiederholungen von gleichen oder stark ähnlichen Teilen bestehen.
Fester Pfad, nichts zu rütteln.
Das kann jeder behaupten.
Wer sagt denn, dass die Variable path innerhalb der procedure TForm1.MidiMessageInFile den korrekten Wert hat?
Vielleicht fehlt ja nur ein abschliesender Backslash oder der Pfad ist relativ.
Glauben heisst nicht wissen.
Du musst schon den Beweis erbringen, dass der Dateiname den du BassPlayer.PlaySound() übergibst auch wirklich existiert.
Es reicht auch nicht wenn du nur mit dem Debugger den Pfad anschaust.
Das menschliche Gehirn ist manchmal blind gegenüber Buchstabendrehern und ähnlichen Fehlern.
Das ist der berühmte Tomaten-auf-den-Augen-Effekt.
Daher: Beweise zuerst, dass die Datei existiert (mit der Funktion FileExists() ) und erst dann kann man den BassPlayer verdächtigen nicht korrekt zu arbeiten.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Bass.dll kollidiert mit Midi Komponenten

  Alt 28. Jul 2012, 01:11
Zitat:
Daher: Beweise zuerst, dass die Datei existiert (mit der Funktion FileExists() ) und erst dann kann man den BassPlayer verdächtigen nicht korrekt zu arbeiten.
Wird wohl schwer manche Leute verbeißen sich so in ihrem Standpunkt
da hilft auch ein Statement wie das von dir nicht viel.

Was er nicht will das will er nicht!

gruss
  Mit Zitat antworten Zitat
tvgcjpgnvid

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

AW: Bass.dll kollidiert mit Midi Komponenten

  Alt 28. Jul 2012, 01:24
Nee ok überzeugt
Ich probiers jetzt, ergebnis folgt:´

Ok zugegeben, die Idee war nicht schlecht.
Die "path" Variable wars nicht schuld. aber da die Path Variable Relativ ist, und der OpenDialog den Aktuellen Pfad verändert gabs da Probleme.
Gefixt, Danke

Geändert von tvgcjpgnvid (28. Jul 2012 um 01:40 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz