![]() |
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. |
Re: MIDI-Dateien als Ressourcen einbinden & abspielen
und wo genau liegt dein Problem?
Beim rausholen oder reinpacken in die Ressource? |
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. |
Re: MIDI-Dateien als Ressourcen einbinden & abspielen
*push* (Ich weiß, noch keine 24h, aber es ist wirklich WICHTIG!)
|
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.
|
Re: MIDI-Dateien als Ressourcen einbinden & abspielen
Könntest du das spezifizieren? Entpacken tue ich nur ungern.
|
Re: MIDI-Dateien als Ressourcen einbinden & abspielen
Das Entpacken ist einfach:
Delphi-Quellcode:
(der zweite Parameter ist der Ressourcen-Name und der dritte der Ressourcen-Typ aus deiner RC-Datei)
with TResourceStream.Create(hInstance, 'MIDI1', 'MIDI') do
begin SaveToFile(TempPath + 'MIDI1.mid'); Free; end; 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). |
Re: MIDI-Dateien als Ressourcen einbinden & abspielen
Danke. Werde es so machen. Außer, jemand weiß was besseres?
|
Re: MIDI-Dateien als Ressourcen einbinden & abspielen
Hab es probiert, aber ich höre nichts. :gruebel:
|
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? |
Re: MIDI-Dateien als Ressourcen einbinden & abspielen
Ja, Ja, Ja, Nein, Ja.
|
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. |
Re: MIDI-Dateien als Ressourcen einbinden & abspielen
Hmm... In meiner Testanwendung klappt es auch auf Anhieb... :gruebel:
|
Re: MIDI-Dateien als Ressourcen einbinden & abspielen
Jetzt funzt es. Frag mich nicht warum. Danke noch mal.
|
Re: MIDI-Dateien als Ressourcen einbinden & abspielen
Kann ich die MIDI wirklich nicht direkt aus der Ressource abspielen?
|
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)
|
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.
|
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).
|
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 |
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:
und hier die Funktion für das Beenden
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;
Delphi-Quellcode:
Nachtrag: Die .RC - Datei (heisst bei mir: mucke.rc)
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;
Delphi-Quellcode:
Gruss
EURO midifile "4.mid"
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