![]() |
Midi-Dateien einbinden und abspielen
Hallo, ich habe folgendes Problem:
Ich moechte als Hintergrundmusik eine Midi-File abspielen und diese möglichst in das Projekt einbinden. Das abspielen einer Datei ist nicht das Problem (über MCI) aber wie kann ich die Midi-File als Ressource abspielen bzw wie muss die *.rc Datei aussehen? Habe schon in verschiedenen Foren gesucht, aber es wurden nur Wav-Einbindungen erläutert. Vielleicht hat ja einer einen Tipp. :spin: |
Moin Arnoldo,
erst einmal herzlich willkommen. Also die RC Datei könnte so aussehen (wenn die Datei DATEI.MID heisst) mymidifile MIDIFILE DATEI.MID Die Resource heisst dann mymimdifile, hat den Typ MIDIFILE und die Datei, die eingebunden wird befindet sich im gleichen Verzeichnis wie die RC Datei. Dann mit der BRCC32.EXE aus dem Delphi Bin Verzeichnis kompilieren, und Du hast die RES Datei die Du einbinden kannst. Mit der Befehlssequenz FindResource, LoadResource, LockResource kannst Du dann einen Pointer auf die geladene Resource erhalten. Wie Du die dann allerdings abspielen kannst weiss ich leider auch nicht. Mit MCI hab' ich mich noch nicht näher beschäftigt. |
um Midi abzuspielen klick hier
![]() |
Danke für die schnelle Antwort.
Ja, das mit dem abspielen (nachdem ich die Datei eingebunden habe) ist genau mein Problem. Ich probier das mal mit dem Pointer. |
@city light
mit externen dateien ist das abspielen ja nicht das problem, aber ich kriege das einfach intern nicht hin. |
Ich probiere es grade aus ,ich mail dann noch mal. :-)
|
So ich habe hier was...
Delphi-Quellcode:
[edit=Daniel B]Delphi-Tags; MfG Daniel B.[/edit]
(* ====================================================== *)
(* project1.dpr *) (* MIDI ohne den Mediaplayer *) (* Copyright (C) 2000 Wolfgang Beintvogl & Toolbox *) (* Compiler: Delphi32 *) (* ====================================================== *) {$MINSTACKSIZE $00004000} {$MAXSTACKSIZE $00100000} {$IMAGEBASE $00400000} {$APPTYPE GUI} PROGRAM Project1; USES Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} BEGIN Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; END. //------------------------project1.dpr ------- E N D E-------------------------- (* ====================================================== *) (* MIDI ohne den Mediaplayer *) (* Copyright (C) 2000-2002 Wolfgang Beintvogl & Toolbox *) (* Compiler: Delphi32 *) (* ====================================================== *) UNIT Unit1; INTERFACE USES Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, MMSystem, ExtCtrls; TYPE TForm1 = CLASS(TForm) Button2 : TButton; Label1 : TLabel; Timer1 : TTimer; CheckBox1 : TCheckBox; Label2 : TLabel; CheckBox2 : TCheckBox; PROCEDURE Button2Click(Sender: TObject); PROCEDURE FormClose(Sender: TObject; VAR Action: TCloseAction); PROCEDURE FormCreate(Sender: TObject); PROCEDURE Timer1Timer(Sender: TObject); PROCEDURE CheckBox1Click(Sender: TObject); PROCEDURE CheckBox2Click(Sender: TObject); PRIVATE ERROR : MCIERROR; errString : ARRAY[0..255] OF CHAR; MCIID : MCIDEVICEID; dwParam : DWord; openParms : TMCI_OPEN_PARMS; Sound, Zufall : BOOLEAN; MYTFN1 : STRING; PROCEDURE StatusMidi; PROCEDURE PlayMidi; PROCEDURE StopMidi; PROCEDURE Res2Temp; END; VAR Form1: TForm1; IMPLEMENTATION {$R *.DFM} {$R Midi.Res} PROCEDURE TForm1.StatusMidi; VAR StatusParm: TMCI_Status_Parms; FFlags : LongInt; BEGIN FFlags := mci_Wait OR mci_Status_Item; StatusParm.dwItem := mci_Status_Mode; Error := mciSendCommand(MCIID, mci_Status, FFlags, LongInt(@StatusParm)); (* 2 = Playing / 1 = Stopped *) IF ((StatusParm.dwReturn - 524) <> 2) AND Sound THEN PlayMidi; IF ((StatusParm.dwReturn - 524) = 1) OR (NOT Sound) THEN StopMidi; Label1.Caption := IntToStr(StatusParm.dwReturn - 524); END; PROCEDURE TForm1.PlayMidi; VAR S : STRING; BEGIN S := MYTFN1; openParms.lpstrElementName := PChar(S); openParms.lpstrDeviceType := 'sequencer'; dwParam := DWord(@openParms); ERROR := mciSendCommand(0, MCI_OPEN,MCI_OPEN_TYPE OR MCI_OPEN_ELEMENT, dwParam); IF ERROR <> 0 THEN BEGIN mciGetErrorString(ERROR, errString, 255); Label1.Caption := 'MCI_OPEN: ' + errString; END ELSE BEGIN Label1.Caption := 'MCI_OPEN ausgeführt'; END; mciId := openParms.wDeviceID; ERROR := mciSendCommand(mciId, MCI_PLAY, MCI_NOTIFY, dwParam); IF ERROR <> 0 THEN BEGIN mciGetErrorString(ERROR, errString, 255); Label1.Caption := 'MCI_PLAY: ' + errString; END ELSE BEGIN Label1.Caption := 'MCI_PLAY ausgeführt'; END; END; PROCEDURE TForm1.StopMidi; BEGIN ERROR := mciSendCommand(mciId, MCI_CLOSE, 0, 0); IF ERROR <> 0 THEN BEGIN mciGetErrorString(ERROR, errString, 255); Label1.Caption := 'MCI_CLOSE: ' + errString; END ELSE BEGIN Label1.Caption := 'MCI_CLOSE ausgeführt'; END; IF Zufall THEN Res2Temp; END; PROCEDURE TForm1.Button2Click(Sender: TObject); BEGIN Close; END; PROCEDURE TForm1.FormClose(Sender: TObject; VAR Action: TCloseAction); BEGIN IF FileExists(MYTFN1) THEN DeleteFile(MYTFN1); END; {$WARNINGS OFF} PROCEDURE TForm1.Res2Temp; VAR RS: TCustomMemoryStream; S : STRING; BEGIN S := 'MIDI_' + Inttostr(random(4) + 1); TRY RS := TResourceStream.Create(hInstance, S, 'MIDI'); RS.SavetoFile(MYTFN1); FINALLY RS.Free; END; END; {$WARNINGS ON} PROCEDURE TForm1.FormCreate(Sender: TObject); VAR Path : ARRAY[0..MAX_PATH] OF CHAR; //S, F : TStream; N : INTEGER; BEGIN GetTempPath(Max_Path, Path); N := 0; WHILE FileExists(Path + '~BS' + IntToStr(N) + '.MID') DO Inc(N); MYTFN1 := Path + '~BS' + IntToStr(N) + '.MID'; // S := TResourceStream.Create(HInstance, 'MIDI_1', 'MIDI'); // F := TFileStream.Create(MYTFN1, FMCreate); // F.CopyFrom(S, S.Size); // S.Free; // F.Free; Res2Temp; Sound := TRUE; Zufall := TRUE; END; PROCEDURE TForm1.Timer1Timer(Sender: TObject); BEGIN StatusMidi; END; PROCEDURE TForm1.CheckBox1Click(Sender: TObject); BEGIN Sound := CheckBox1.Checked; END; PROCEDURE TForm1.CheckBox2Click(Sender: TObject); BEGIN Zufall := CheckBox2.Checked; END; END. |
:spin: DANKE, ES FUNKTIONIERT!!!! :spin:
*freu* hier meine etwas übersichtlichere Lösung: unit1.pas
Delphi-Quellcode:
und hier die 'Test.rc':... implementation const filename='~temp.mid'; {$R *.dfm} {$R Test.res} // DER WICHTIGSTE TEIL -> DAS TEMPORÄRE ABSPEICHERN {$WARNINGS OFF} PROCEDURE TForm1.Res2Temp; VAR RS: TCustomMemoryStream; S : STRING; BEGIN S := 'Sound1'; {Name der Resource} TRY RS := TResourceStream.Create(hInstance, S, 'MIDIFILE'); RS.SavetoFile(filename); FINALLY RS.Free; END; END; {$WARNINGS ON} procedure TForm1.FormCreate(Sender: TObject); begin Res2Temp(form1); {Midi-File wird ausgelagert -> ~temp.mid} MCISendString(PChar('play '+ filename), nil, 0, 0); {und abgespielt} end; procedure TForm1.BitBtn1Click(Sender: TObject); {Stop-Button} begin MCISendString(PChar('stop ' + Filename), nil, 0, 0); end; procedure TForm1.ende(Sender: TObject; {Ende} var Action: TCloseAction); begin if fileexists(filename) then deletefile(filename); MCISendString(PChar('stop ' + Filename), nil, 0, 0); MCISendString('close sound', nil, 0, 0); end; end.
Delphi-Quellcode:
[Edit=FuckRacism]Delphi-Tags[/Edit]
sound1 MIDIFILE eyeofthetiger.mid
|
Schön... wieder einen Menschen Glücklich gemacht :dancer:
Grüße ,Tino :hi: |
Das geht leider nicht.
Delphi-Quellcode:
Und einen sound bekomme ich auch nicht zu hören.
procedure TForm1.FormCreate(Sender: TObject);
begin Res2Temp(form1);zu viele argument kommt alls nachricht wenn ich das so verwende. MCISendString(PChar('play '+ filename), nil, 0, 0); {und abgespielt} end; procedure TForm1.BitBtn1Click(Sender: TObject); {Stop-Button} begin MCISendString(PChar('stop ' + Filename), nil, 0, 0); end; procedure TForm1.ende(Sender: TObject; {Ende} var Action: TCloseAction); begin if fileexists(filename) then deletefile(filename); MCISendString(PChar('stop ' + Filename), nil, 0, 0); MCISendString('close sound', nil, 0, 0); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 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