Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi MIDI-Dateien als Ressourcen einbinden & abspielen (https://www.delphipraxis.net/52924-midi-dateien-als-ressourcen-einbinden-abspielen.html)

3_of_8 6. Sep 2005 21:15


MIDI-Dateien als Ressourcen einbinden & abspielen
 
Hallo erstmal.

Ich bin gerade dabei, die Junioraufgabe des Bundeswettbewerbs für Informatik zu lösen.
Ich werde mit allem ganz gut fertig, aber jetzt will ich noch Hintergrundmusik.

Da das ganze was mit Lemmingen zu tun hat, hab ich mir 10 Original Lemming MIDIS ausgesucht, für jedes der 10 Level.

Jetzt muss ich die Teile aber noch einbinden, und da ich es lieber schön verpackt habe, würde ich die MIDIS gerne als Ressourcen in die EXE einbinden und aus dem Programm abspielen, so ähnlich wie das Abspielen von WAVE-Ressourcen mit PlaySound (Was auch gleichzeitig noch funktionieren sollte.)

Vielen Dank für die Hilfe.

MarcoWarm 7. Sep 2005 18:33

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
und wo genau liegt dein Problem?
Beim rausholen oder reinpacken in die Ressource?

3_of_8 7. Sep 2005 22:35

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Bei Letzterem.

Die *.RES Datei habe ich schon erstellt (mit BRCC32.exe)

Wie ich das jetzt raushole und abspiele weiß ich nicht. Sollte auf möglichst vielen Rechner funzen.

3_of_8 8. Sep 2005 18:58

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
*push* (Ich weiß, noch keine 24h, aber es ist wirklich WICHTIG!)

Flocke 8. Sep 2005 19:14

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Also du könntest die Dateien natürlich einfach wieder in ein temporäres Verzeichnis entpacken und dann via Mediaplayer abspielen. Das Speichern solltest du mit einem TResourceStream und einem TFileStream hinbekommen.

3_of_8 8. Sep 2005 19:15

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Könntest du das spezifizieren? Entpacken tue ich nur ungern.

Flocke 8. Sep 2005 19:26

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Das Entpacken ist einfach:

Delphi-Quellcode:
with TResourceStream.Create(hInstance, 'MIDI1', 'MIDI') do
begin
  SaveToFile(TempPath + 'MIDI1.mid');
  Free;
end;
(der zweite Parameter ist der Ressourcen-Name und der dritte der Ressourcen-Typ aus deiner RC-Datei)

Das Problem mit MIDIs ist, dass du, wenn du sie selbst abspielst, auf das Timing achten musst. Du müsstest also jede Note genau zum passenden Zeitpunkt senden. Diese Arbeit nimmt der MediaPlayer dir ab.

Zweite Variante - fällt mir gerade so ein: du könntest einen OLE-Container nehmen und die MIDIs als OLE-Objekte da hinein packen. Ggf. kannst du sie von dort aus direkt abspielen (bin mir aber absolut nicht sicher ob das überhaupt geht).

3_of_8 8. Sep 2005 19:28

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Danke. Werde es so machen. Außer, jemand weiß was besseres?

3_of_8 8. Sep 2005 20:03

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Hab es probiert, aber ich höre nichts. :gruebel:

Flocke 8. Sep 2005 20:10

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Also, du
1. Speicherst die MIDI-Datei ab? Datei existiert?
2. Setzt in der MediaPlayer-Komponente den Dateinamen auf diesen Namen?
3. Startest im MediaPlayer die Wiedergabe?

Klappt die Wiedergabe mit einer vorhandenen Datei? Ggf. mit der Datei ausprobieren, die du benutzen willst.

Du kannst MIDIs aber hören, wenn du die Datei im Explorer doppelt klickst, oder?

3_of_8 8. Sep 2005 20:44

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Ja, Ja, Ja, Nein, Ja.

Flocke 8. Sep 2005 21:14

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Das Nein bedeutet also, dass du in der MediaPlayer bei Filename eine existierende Midi-Datei ausgewählt hast, z.B. "C:\WINDOWS\Media\town.mid", danach das Programm gestartet und dann auf Play gedrückt hast (oder programmtechnisch gemacht) ... und dann hörst du nichts.

Also ich habe gerade mal eine kleine Testanwendung gemacht, da klappts auf Anhieb.

3_of_8 8. Sep 2005 21:21

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Hmm... In meiner Testanwendung klappt es auch auf Anhieb... :gruebel:

3_of_8 8. Sep 2005 21:31

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Jetzt funzt es. Frag mich nicht warum. Danke noch mal.

3_of_8 9. Sep 2005 17:35

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Kann ich die MIDI wirklich nicht direkt aus der Ressource abspielen?

MarcoWarm 9. Sep 2005 17:48

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
das geht leider nicht.... obwohl... du könntest schauen, ob die Mediaplayerkomponente ein LoadFromStream hat.... falls ja, dann kannst du den Inhalt der Ressource in nen Memorystream schreiben und abspielen (hab leider kein Delphi hier um das zu prüfen)

PierreB 9. Sep 2005 17:50

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Wenn ich mich recht erinnere, kann man mittels Bass.dll auch direkt aus Resourcenabspielen, bin mir aber nicht sicher.

Flocke 9. Sep 2005 18:10

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Also die TMediaPlayer-Komponente arbeitet über das MCI-Interface und braucht daher IMHO eine Datei. Was ist das Problem dabei? Einfach in's temporäre Verzeichnis entpacken und beim Beenden der Anwendung wieder löschen (du kannst ja immer denselben Dateinamen benutzen).

emsländer 30. Nov 2005 10:06

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
Auch ich experimentiere mit dem Resourcenkram rum.

WAV klappt einwandfrei über den playsound
MP3 als WAV getarnt ebenso

nun wollte ich ein .midi ebenfalls einbinden und habe mit dazu, wie hier in der DP beschrieben die bassdll installiert und versuche die zu nutzen. Da bekomme ich nur eine Fehlermeldung(Resource EURO wurde nicht gefunden). Kann mir mal jemand den korrekten Aufruf mitteilen?

BassdllPlayer1.LoadFromResourceName('EURO' ,RC_MUSIC)

meine .rc hier anbei:


MUSIK Wave "a.wav" -klappt
SPUEL Wave "b.wav" -klappt
HYMNE Wave "c.wav" -klappt
EURO MIDI "4.mid" -klappt nicht



Danke und Gruss

EL

emsländer 30. Nov 2005 11:20

Re: MIDI-Dateien als Ressourcen einbinden & abspielen
 
So - habs jetzt rausgefunden und möchte €uch diese recht einfache Variante nicht vorenthalten.


irgendwo im projekt global definieren:

Delphi-Quellcode:
const filename :string = '~tmp.mid';


dann eine Funktion, die das abspielen startet:

Delphi-Quellcode:
function startmidi(_resourcename : string) : boolean
var  _sstream: TCustomMemoryStream;
begin
  try
    _sstream := TResourceStream.Create(hInstance, _resourcename, 'MIDIFILE');
    _sstream.SavetoFile(filename);
  finally
    _sstream.Free;
  end;
  MCISendString(PChar('play '+ filename), nil, 0, 0);
  result := true;
end;
und hier die Funktion für das Beenden
Delphi-Quellcode:
function endmidi : boolean
begin
  MCISendString(PChar('stop ' + Filename), nil, 0, 0);
  MCISendString('close sound', nil, 0, 0);
  if fileexists(filename) then deletefile(filename);
  result := true;
end;
Nachtrag: Die .RC - Datei (heisst bei mir: mucke.rc)

Delphi-Quellcode:
EURO midifile "4.mid"
Gruss

EL


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz