Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mein Computer pfeift Lapaloma - Aber wie? -->Windows.Beep (https://www.delphipraxis.net/147479-mein-computer-pfeift-lapaloma-aber-wie-windows-beep.html)

Fussel9 9. Feb 2010 18:10


Mein Computer pfeift Lapaloma - Aber wie? -->Windows.Beep
 
Hi ich hab mir zu Windows.Beep mal einiges durchgelesen, aber habe eine rudimentäre Frage:

Wenn ich ein Lied damit spielen lassen möchte, muss ich dann jeden Ton kennen?
Wäre es nicht möglich die Frequenzen aus einem Lied herrauslesen zu lassen, wie auch immer das gehen könnte?
Und was genau ist eigendlich BPM also die Beats per Minute und was mache ich damit?

Hoffe ihr könnt mir weiterhelfen...

Ich wollte ein Programm schreiben welches die Frequenzen und die BPM, sofern ich die brauche in eine Ini- oder Txt-Datei einließt und dann ein zweites welches die Frequenzen und co. aus der txt ausließt und dann mit Windows.Beep abspielt.

implementation 9. Feb 2010 18:18

Re: Mein Computer pfeift Lapaloma - Aber wie? -->Windows.
 
Textdateien sind da nicht so sinnvoll. Speichere es binär!

Hier zum Laden:
Delphi-Quellcode:
type
  TTon = record
    Frequenz: Word;
    BPM: Word;
  end;
  TLied = array of TTon;
  TNotenblatt = file of TTon;
var
  f: TNotenblatt;
  l: TLied;
  t: TTon;
begin
  AssignFile(f, 'Lieddatei');
  Reset(f);
  while not eof(f) do begin
    Read(f,t)
    SetLength(l,Length(l)+1);
    l[Length(l)-1] := t;
  end;
  CloseFile(f);
end;

himitsu 9. Feb 2010 18:24

Re: Mein Computer pfeift Lapaloma - Aber wie? -->Windows.
 
Du kannst dir die Töne auch umrechnen und ausgeben lassen. :angel:
http://www.delphipraxis.net/internal...t.php?t=168363

BPM sind praktisch "Noten pro Minute"

Notendauer + Pausendauer = 1 Minute / BMP

shmia 9. Feb 2010 19:00

Re: Mein Computer pfeift Lapaloma - Aber wie? -->Windows.
 
Just for Info:
* ein kleines Liedchen mit Windows.Beep abspielen
Schwierigkeitsgrad: sehr einfach
* Noten in Frequenzen umrechnen
Schwierigkeitsgrad: einfach, Frequenzen kann man mit 12. Wurzel von 2 leicht ausrechnen
* ein Liedchen monophon über Soundkarte oder MIDI abspielen
Schwierigkeitsgrad: einfach bis mittel
* ein Liedchen polyphon über MIDI abspielen
Schwierigkeitsgrad: mittel
* Frequenzen aus einem Lied herrauslesen
Schwierigkeitsgrad: hoch bis sehr hoch
* Beats per Minute ermitteln
Schwierigkeitsgrad: hoch bis sehr hoch
* Frequenzen aus einem Lied zurück in Notenschrift verwandeln
Schwierigkeitsgrad: extrem hoch bis fast unmöglich

Damit sollte klar sein, welche Probleme du bewältigen kannst und welche nicht.

Fussel9 9. Feb 2010 19:20

Re: Mein Computer pfeift Lapaloma - Aber wie? -->Windows.
 
Zitat:

Zitat von implementation
Delphi-Quellcode:
begin
  AssignFile(f, 'Lieddatei');
  Reset(f);
  while not eof(f) do begin
    Read(f,t)
    SetLength(l,Length(l)+1);
    l[Length(l)-1] := t;
  end;
  CloseFile(f);
end;

Ich versteh das Read nicht ganz:
Aus F (also z.B. Test.mp3) wird in T gelesen (Also TTon)

Wo wird denn bestimmt was er wo einließt also wo Steht, dass er t.Frequenz einen wert zuweisen soll?

!€!D!|!T :

Ab einem bestimmten Punkt derden Frequenz und Length nur noch 0 zugewiesen obwohl das lied noch nicht vorbei ist....

EDIT2:

Ok, ich habe es jetzt so programmiert:
Delphi-Quellcode:
unit UMain;

interface

uses
  IniFiles, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    BLoad: TButton;
    PB: TProgressBar;
    TWait: TTimer;
    BSave: TButton;
    procedure BLoadClick(Sender: TObject);
    procedure TWaitTimer(Sender: TObject);
    procedure BSaveClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    procedure Laden;
    procedure Speichern;
  end;

type
  TTon = record
    Frequenz: Word;
    BPM: Word;
  end;

TLied = array of TTon;
TNotenblatt = file of TTon;

var
  f: TNotenblatt;
  l: TLied;
  t: TTon;
  Save: TIniFile;
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.BLoadClick(Sender: TObject);
begin
Laden;
end;

procedure TForm1.BSaveClick(Sender: TObject);
begin
Speichern;
end;

procedure TForm1.Laden;
begin
PB.Position:=0;
  AssignFile(f,'Test.mp3');
  Reset(f);
  while not eof(f) do begin
    PB.StepBy(1);
    Read(f,t);
    SetLength(l,Length(l)+1);
    l[Length(l)-1] := t;
  end;
  CloseFile(f);
PB.Position:=100;
TWait.Enabled:=TRUE;
end;

procedure TForm1.Speichern;
begin
PB.Position:=0;
Save:=TIniFile.Create('save.ini');
  while not (Length(l)=0) do
    begin
      PB.StepBy(1);
      Save.WriteInteger('Lied','Frequenz',l[1].Frequenz);
      Save.WriteInteger('Lied','BPM',l[1].BPM);
      SetLength(l,Length(l)-1);
    end;
Save.Free;
PB.Position:=100;
TWait.Enabled:=TRUE;
end;

procedure TForm1.TWaitTimer(Sender: TObject);
begin
PB.Position:=0;
TWait.Enabled:=False;
end;

end.
Das dauert schon ziehmlich lange bis der mit Laden fertig ist,
aber noch SEHR viel länger um mit Speichern fertig zu werden....

Warum ist das so, mache ich was falsch?

Ps: Was genau meintest du damit das ich es Binär abspeichern sollte?

Fussel9 9. Feb 2010 21:10

Re: Mein Computer pfeift Lapaloma - Aber wie? -->Windows.
 
Das mit der Wiedergabe geht auch nicht:
Meine frage bezüglich der BPM war auch, was soll ich damit machen....
Wenn ich BPM als tonlänge angebe kommt ein konstanter Ton
gebe ich etwas anderes an kommt ein komisches gewirr...

Weiß irgendjemand noch was zu dem thema?

hugo1990 9. Feb 2010 21:17

Re: Mein Computer pfeift Lapaloma - Aber wie? -->Windows.
 
Hast du dir mal angeschaut, was die Befehle denn so machen bzw. dir mal alle Antworten die du bekommen hast durchgelesen.

Was soll das denn deiner Meinung nach machen?

Delphi-Quellcode:
procedure TForm1.Laden;
begin
PB.Position:=0;
  AssignFile(f,'Test.mp3');
  Reset(f);
  while not eof(f) do begin
    PB.StepBy(1);
    Read(f,t);
    SetLength(l,Length(l)+1);
    l[Length(l)-1] := t;
  end;
  CloseFile(f);
PB.Position:=100;
TWait.Enabled:=TRUE;
end;
Ich denke mal, dass du damit die MP3-Datei in die einzelnen Töne umwandeln möchtest. Wenn du dich aber mal ein wenig damit auseinander gesetzt hättest, was denn di Befehle machen, wärst du warscheinlich schnell darauf gekommen, dass das nichts wird.
Der Read-Befehl befüllt t mit 4 Byte (siehe Record TTon -> 2 x Word -> 2 x 2 Byte) aus der Datei. Eine MP3-Datei ist aber nicht im geringsten so aufgebaut, das immer ein Word für die Frequenz und ein Word für die Länge aufeinander folgen. Schon allein, dass allgemein bekannt sein sollte, das MP3-Dateien kompriemierte Informationen beinhalten sollte zeigen, dass dein Vorhaben so nicht funktionieren kann.
Und bevor du noch weiter versuchst, an die Noten einer MP3-Datei zu kommen, möchte ich dir nur sagen, dass du da definitiv kläglich scheitern wirst. Es gibt da ein Projekt vom Frauenhofer Institut, welches sich damit beschäftigt, was hauptsächlich darum geht, von einer vorgespielten Melodie zu erkennen, welches Lied es ist. Im Hintergrund müssen dafür aber die Töne auch entsprechend bestimmt werden. Und die Leute die da sitzen, haben sich da jahrelang mit beschäftigt und haben bestimmt um einiges mehr Ahnung auf diesem Gebiet als du.
Schau lieber, dass du so irgenwo Noten her bekommst, welche du dann in eine Datei mit dem hier vorgeschlagenen Format speichern kannst. Da wirst du mehr Freude dran haben.

Fussel9 9. Feb 2010 21:24

Re: Mein Computer pfeift Lapaloma - Aber wie? -->Windows.
 
Ich will ja eigendlich gar nicht die NOTEN ... alles was ich wollte war, eine Musik-Datei welchen Formates auch immer in eine Textdatei einzulesen, damit ich sie jederzeit, ohne die Musikdatei zu haben mit Windows.Beep abspielen kann.

Z.B.: Ich nehme das Adamsfamilytheme kann ich in alle Formate umwandeln...

alles was ich nun will ist das so zu 'lesen' das ich es mit Windows.Beep abspielen kann.

hugo1990 9. Feb 2010 21:29

Re: Mein Computer pfeift Lapaloma - Aber wie? -->Windows.
 
Um es mit Windows.Beep abspielen zu können, benötigst du aber die Noten bzw. die Frequenz und die Länge eines Tones und bekommst du nicht aus normalen Musikdateien. Du könntest du mal mit dem MIDI-Format auseinander setzen, da sollten diese Informationen enthalten sein.

Fussel9 9. Feb 2010 21:33

Re: Mein Computer pfeift Lapaloma - Aber wie? -->Windows.
 
Ich habe die Datei auch als Midi vorliegen ... bzw kann dementsprechend konvertieren, mit externen programmen...

Wie funktionieren denn diese?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 Uhr.
Seite 1 von 2  1 2      

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