AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Midi-Dateien einbinden und abspielen

Midi-Dateien einbinden und abspielen

Ein Thema von arnoldo · begonnen am 8. Dez 2002 · letzter Beitrag vom 29. Dez 2009
Antwort Antwort
arnoldo

Registriert seit: 8. Dez 2002
Ort: Berlin
131 Beiträge
 
Delphi 7 Personal
 
#1

Midi-Dateien einbinden und abspielen

  Alt 8. Dez 2002, 17:37
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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von City Light
City Light

Registriert seit: 17. Sep 2002
314 Beiträge
 
#3
  Alt 8. Dez 2002, 18:30
um Midi abzuspielen klick hier http://www.delphipraxis.net/viewtopic.php?t=953
Bis bald man liest sich
Tino
  Mit Zitat antworten Zitat
arnoldo

Registriert seit: 8. Dez 2002
Ort: Berlin
131 Beiträge
 
Delphi 7 Personal
 
#4
  Alt 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.
  Mit Zitat antworten Zitat
arnoldo

Registriert seit: 8. Dez 2002
Ort: Berlin
131 Beiträge
 
Delphi 7 Personal
 
#5
  Alt 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.
  Mit Zitat antworten Zitat
Benutzerbild von City Light
City Light

Registriert seit: 17. Sep 2002
314 Beiträge
 
#6
  Alt 8. Dez 2002, 18:36
Ich probiere es grade aus ,ich mail dann noch mal.
Bis bald man liest sich
Tino
  Mit Zitat antworten Zitat
Benutzerbild von City Light
City Light

Registriert seit: 17. Sep 2002
314 Beiträge
 
#7
  Alt 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]
Bis bald man liest sich
Tino
  Mit Zitat antworten Zitat
arnoldo

Registriert seit: 8. Dez 2002
Ort: Berlin
131 Beiträge
 
Delphi 7 Personal
 
#8
  Alt 8. Dez 2002, 20:00
DANKE, ES FUNKTIONIERT!!!!

*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':
sound1 MIDIFILE eyeofthetiger.mid [Edit=FuckRacism]Delphi-Tags[/Edit]
  Mit Zitat antworten Zitat
Benutzerbild von City Light
City Light

Registriert seit: 17. Sep 2002
314 Beiträge
 
#9
  Alt 9. Dez 2002, 15:21
Schön... wieder einen Menschen Glücklich gemacht

Grüße ,Tino
Bis bald man liest sich
Tino
  Mit Zitat antworten Zitat
master87

Registriert seit: 17. Sep 2009
3 Beiträge
 
#10
  Alt 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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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