Entwickler-Ecke

Multimedia / Grafik - Midi aus Ressource abspielen


Saubäär - Mi 28.02.07 20:08
Titel: Midi aus Ressource abspielen
Midi aus Ressource abspielen

Die folgende Prozedur liest eine Mididatei aus einer Ressource aus, speichert sie in einer temporären Datei und spielt sie ab.

allgemeiner Aufbau der Datei "midi.rc", die zu "midi.res" kompiliert wird:

Quelltext
1:
2:
3:
mOne MIDIFILE "test.mid"
mTwo MIDIFILE "hallo.mid"
mThree MIDIFILE "ende.mid"


Der Quelltext zum Auslesen und Abspielen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
uses mmSystem, ...

{$R midi.res} // WICHTIG! Ressource einbinden

procedure Midi(const aResName: String);
const
  Len: Cardinal = MAX_PATH;
  tmpFile: String = '~tmpFile01'// Name der temporären Datei
var
  Stream: TCustomMemoryStream;
  BufLen, BufPos, tmpPath: String;
begin
  // Temp- Verzeichnis ermitteln
  SetLength(tmpPath, Len);
  GetTempPath(Len, PChar(tmpPath));
  tmpPath := StrPas(PChar(tmpPath)) + tmpFile;

  mciSendString('stop mySound'nil00);
  mciSendString('close mySound'nil00);
  if FileExists(tmpPath) then // temporäre Datei löschen (falls noch vorhanden)
    DeleteFile(tmpPath);

  if FindResource(hInstance, PChar(aResName), 'MIDIFILE') <> 0 then
  begin // Ist die Ressource verfügbar
    try
      Stream := TResourceStream.Create(hInstance, aResName, 'MIDIFILE'); // Stream erstellen
      Stream.SaveToFile(tmpPath); // temporäre Datei speichern
    finally
      Stream.Free;
    end;
  end
  else
  begin
    MessageBeep(MB_ICONEXCLAMATION);
    MessageDlg('Die Ressource kann nicht gefunden werden.', mtError, [mbOk], 0);
    Exit;
  end;

  mciSendString(PChar('open sequencer!' + tmpPath + ' alias mySound'), nil00);
  mciSendString('play mySound' , nil00);

  SetLength(BufLen, Len);
  SetLength(BufPos, Len);
  mciSendString('status mySound length', PChar(BufLen), Len, 0); // Länge der Mididatei ermitteln
  repeat
    mciSendString('status mySound position', PChar(BufPos), Len, 0); // aktuelle Position ermitteln ...
    Application.ProcessMessages;
    if Application.Terminated then
      break;
  until StrToInt(BufPos) >= StrToInt(BufLen); // ... bis Dateiende erreicht ist
  mciSendString('stop mySound'nil00);
  mciSendString('close mySound'nil00);

  if FileExists(tmpPath) then // temporäre Datei löschen
    DeleteFile(tmpPath);
end;


Aufruf aus angehängter Beispielressource:

Delphi-Quelltext
1:
  Midi('mOne');                    


Gruß

Saubäär