Delphi-PRAXiS

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?

hugo1990 9. Feb 2010 21:39

Re: Mein Computer pfeift Lapaloma - Aber wie? -->Windows.
 
Ein bisschen Eigeninitiative wäre schon nicht schlecht:
http://lmgtfy.com/?q=midi+format
Wenn du dann nicht weiter kommst, helfen wir dir gern weiter. Aber wenn du ein Programm schreiben möchtest, dann solltest du auch etwas dafür tun und nicht alles die anderen machen lassen.

himitsu 9. Feb 2010 23:58

Re: Mein Computer pfeift Lapaloma - Aber wie? -->Windows.
 
Theoretisch könnte man erstmal mit FFT oder Ähnlichem eine Sounddatei in seine Frequenzen zerlegen.
(macht man bei MP3s ja auch nicht anders)

Aber aus diesen Frequenzen dann geziehlt bestimmte Noten rauszubekommen ist nicht unbedingt einfacher.
Denn ein Lied besteht nunmal nicht nur aus einer Frequenz, sondern aus mehreren/vielen überlagerten Frequenzen (inkl. Störgeräuche und Co.) und dort jetzt nur die Frequenz zu isolieren, welche zur Melodie gehört, das ist nahezu unmöglich.

Medium 10. Feb 2010 00:38

Re: Mein Computer pfeift Lapaloma - Aber wie? -->Windows.
 
Auch auf die Gefahr hin, dass da wieder so ein unqualifiziertes "böööh, dich kennen wir ja schon" kommt: Du stellst dir das extrem viel zu einfach vor. Mach dich zunächst ein Mal mit den Grundlagen der Signalverarbeitung vertraut. (Ja, das ist schon nicht wenig.) Dann hast du eine gute Chance zu verstehen was überhaupt in einer Wave-Datei steht, bis zu dem Punkt zu verstehen was bei MP3 passiert, ist es dann aber immer noch ein recht weiter weg.
Wenn du soweit mal bist (und auch ich selber hab den ganzen Kram über mehrere Jahre verteilt an der FH gelernt, erwarte kein Wochenendprojekt), dann fangen deine Probleme erst richtig an. Das ist dann die Stelle, wo sich, wie bereits zuvor jemand geschrieben hat, ganze Abteilungen nicht ganz ahnungsloser Forschungsteams mit beschäftgen lassen.

Und du machst es im Grunde noch schwieriger, in dem du nachher mit Beep() dran gehen willst, dass ja nur einen einzigen Ton ausgeben, keine Instrumente nachbilden, und schon garnicht polyphon genutzt werden kann. Frequenzen ermitteln ist theoretisch schon moppig, gibt's aber gute Libraries für. Signifikante Frequenzen auswählen ist schon erheblich komplizierter, und dann noch sicher stellen, dass sie der wahrgenommenen Hauptmelodie entsprechen, dürfte endgültig das Ende sein - das schaffen evtl. mal Systeme die wirklich wie ein Mensch wahrnehmen, und nicht mehr nur verarbeiten und analysieren. Das ist im Moment eher Science-Fiction, und klappt selbst in den hochgezüchtesten Systemen bestenfalls schätzungsweise, und bedarf praktisch immer manueller Nachbearbeitung. Mindestens.

Das heisst selbst wenn du der Obercrack auf diesem Gebiet wärst, würdest du es höchst wahrscheinlich nicht schaffen, das was dir vorschwebt zu basteln. Und wenn ich so frei sein darf: Von Obercrack bist du Lichtjahre entfernt wenn ich das hier so lese.

Fussel9 10. Feb 2010 18:55

Re: Mein Computer pfeift Lapaloma - Aber wie? -->Windows.
 
Wow Medium, ich muss schon sagen... ein ganzer Post ohne vom Thema abzukommen, ja ihr habt da wohl recht, ich weiß weder wie eine wav-Datei noch wie eine Midi-Datei, noch wie eine MP3-Datei aufgebaut ist,
Ich hatte nur gedacht, das man bei irgendeiner sorte von musikdateien die Frequenzen rauslesen könnte...

Aber da schein ich wohl den Riesen beim Zeh gepackt zu haben ;)

Versuchs dann auf anderen Wegen weiter ... THX

PS: Auch und Medium :thumb: Weiter so :wink:

himitsu 10. Feb 2010 19:21

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

Zitat von Fussel9
Ich hatte nur gedacht, das man bei irgendeiner sorte von musikdateien die Frequenzen rauslesen

Eine WAVE-Datei (das unkomprimierte Urformat), besteht aus einer Reihe von "Spannungswerten" ... z.B. bei 44 kBit steht dort 44-tausend mal pro Sekunde die "Signalstärke" des Audioausganges hintereinander.
(bei Stereo natürlich abwechselnd für Links und Rechts)

Ein MP3 ist quasi und so im Großen und Ganzen eine Liste von Frequenzen.
Die MP3s sind dadurch kleiner, da man erstmal eine Frequenzanalyse des Sounds macht,
dann werden möglichst die leisen und/oder unhörbaren/unauffälligen Frequenzen entfernt
und der Rest landet in der Datei.
http://de.wikipedia.org/wiki/Mp3#Kompression_im_Detail

Viktorii 11. Feb 2010 11:26

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

Zitat von shmia
* Noten in Frequenzen umrechnen
Schwierigkeitsgrad: einfach, Frequenzen kann man mit 12. Wurzel von 2 leicht ausrechnen

Wie genau funktioniert das? Hab's nicht verstanden. Wenn ich jetzt z.B. die Frequenz von c'' haben möchte?

himitsu 11. Feb 2010 11:46

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

Zitat von Viktorii
Wie genau funktioniert das? Hab's nicht verstanden. Wenn ich jetzt z.B. die Frequenz von c'' haben möchte?

Schau einfach mal in mein hier verlinktes "Play"-Projekt.
Dort werden ja die Noten in Frequenzen für's Beep umgerechner, also findet man da auch die nötigen Berechnungen.

Die Berechnungen selber hatte ich mir vorwiegend mit Hilfe der Wikipedia "Oktave" und mit ein bissl rumprobieren zusammengebastelt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:09 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