Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Midi-Dateien einbinden und abspielen (https://www.delphipraxis.net/1557-midi-dateien-einbinden-und-abspielen.html)

arnoldo 8. Dez 2002 17:37


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:

Christian Seehase 8. Dez 2002 18:20

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.

City Light 8. Dez 2002 18:30

um Midi abzuspielen klick hier http://www.delphipraxis.net/viewtopic.php?t=953

arnoldo 8. Dez 2002 18:31

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.

arnoldo 8. Dez 2002 18:34

@city light

mit externen dateien ist das abspielen ja nicht das problem, aber ich kriege das einfach intern nicht hin.

City Light 8. Dez 2002 18:36

Ich probiere es grade aus ,ich mail dann noch mal. :-)

City Light 8. Dez 2002 19:02

So ich habe hier was...

Delphi-Quellcode:
 (* ====================================================== *)
(*                     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.
[edit=Daniel B]Delphi-Tags; MfG Daniel B.[/edit]

arnoldo 8. Dez 2002 20:00

:spin: DANKE, ES FUNKTIONIERT!!!! :spin:

*freu*

hier meine etwas übersichtlichere Lösung:

unit1.pas
Delphi-Quellcode:

...
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.
und hier die 'Test.rc':
Delphi-Quellcode:
sound1 MIDIFILE eyeofthetiger.mid
[Edit=FuckRacism]Delphi-Tags[/Edit]

City Light 9. Dez 2002 15:21

Schön... wieder einen Menschen Glücklich gemacht :dancer:

Grüße ,Tino :hi:

master87 29. Dez 2009 13:59

Das geht leider nicht.
Delphi-Quellcode:
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;
Und einen sound bekomme ich auch nicht zu hören.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 Uhr.

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