Autor Beitrag
Saubäär
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 376



BeitragVerfasst: Mi 28.02.07 20:08 
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:
ausblenden Quelltext
1:
2:
3:
mOne MIDIFILE "test.mid"
mTwo MIDIFILE "hallo.mid"
mThree MIDIFILE "ende.mid"


Der Quelltext zum Auslesen und Abspielen:
ausblenden volle Höhe 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:
ausblenden Delphi-Quelltext
1:
  Midi('mOne');					


Gruß

Saubäär


midi.zip  (631 Bytes) Download (Rev 0)
 (923x, 923x gesamt)
Beschreibung: Beispielressource


Zuletzt bearbeitet von Saubäär am Sa 17.03.07 23:09, insgesamt 13-mal bearbeitet