Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren (https://www.delphipraxis.net/166412-midi-oeffnen-und-zu-frequenz-hz-und-laenge-ms-konvertieren.html)

Magic94 12. Feb 2012 14:58

MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
 
Hallo,
ich arbeite schon seit längerem an einem Projekt namens "Beeptracker"
Nun habe ich mir in den Kopf gesetzt MIDIs da importieren zu können, leider habe ich davon nicht so die Ahnung und schon bei dem kleinsten Versuch bekomme ich nur Fehler raus.
Ich weiss das es schwer zu realisieren ist, aber nachdem die .mid Datei ausgewählt wurde erscheint ein Dialog, indem alle Channel die es gibt angezeigt werden, einzeln probehören kann (per MS-Wavetable) und dann 2 davon auswählen kann die dann Importiert werden. Da jetzt aber auch in einem Channel mehrere Noten gleichzeitig gedrückt werden können würde ich mal sagen nimmt man einfach Random eine daraus (falls es mehrere sind).

Nun aber zum eigentlichen:
Es sollen also innerhalb kürzester Zeit die MIDI Ereignisse in Frequenzen und Längen umgewandelt werden und in ein:

Code:
playArray: array of array of integer;
gepackt werden.

Wir haben im Tracker 2 Kanäle zur verfügung: die Länge pro Note ist gleich also brauchen wir nur 3 dynamische Arrays:

Code:
SetLength(playArray,3);
      SetLength(playArray[0],....);
      SetLength(playArray[1].....);
      SetLength(playArray[2],....);
wer sich das jetzige Programm mal anschauen will: http://tenac.webhop.net/beeptracker/

Sir Rufo 13. Feb 2012 06:57

AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
 
Ich weiß irgendwie nicht, was du jetzt möchtest. Willst du
  1. zeigen, dass du an dem Projekt noch arbeitest
  2. deine Website bewerben
  3. unsere Glaskugeln testen
  4. deine Langeweile bekämpfen
Eine konkrete Frage kann ich nicht erkennen

EWeiss 13. Feb 2012 16:56

AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
 
Zitat:

Ich weiß irgendwie nicht, was du jetzt möchtest. Willst du
Er will ein fertiges programm um Midi abspielen zu können ;)

Hier mal ne kleine Unit von mir auf mmsystem aufgebaut.

Delphi-Quellcode:
unit MidiPlayer;

interface

uses Windows, Messages, mmsystem, StrUtils, SysUtils, Dialogs;

type
  TKaraGLPlayer = class
  private
    { private-Deklarationen }
    MIDI_Device: Uint;
    command: PWideChar;
    return: array [0..50]of char;
    resultSize: Integer;
  protected
    { protected-Deklarationen }
  public
    { public-Deklarationen }
    duration: Integer;
    paused: Bool;
    function getPosition: Integer;
    procedure play;
    procedure pausePlay;
    procedure stop;
    constructor Create(fileName: string; autoplay: Bool);
    destructor Destroy;
  end;

implementation

{ TKaraGLPlayer }

constructor TKaraGLPlayer.Create(fileName: string; autoplay: Bool);
var
  lResult: cardinal;
begin

  //init variables
  paused := FALSE;
  MIDI_Device := 0;
  resultSize := 50;

   // We want to play a MIDI.
   command := PWideChar('open "' + fileName + '" type sequencer alias karagl wait');
  lResult := mciSendString(command, return, resultSize, 0);

   if lResult <> 0 then
  begin
    mciGetErrorString(lResult, return, 50);
    ShowMessage('MCI error:' + return);
      duration := 0;
   end;

   // Calculate duration
   command := ('set karagl time format milliseconds wait');
   mciSendString(command, return, resultSize, 0);

   command := ('status karagl length wait');
   mciSendString(command, return, resultSize, 0);
   if (StrLen(return) > 0) then
      duration := StrToInt(return)
   else
  duration := 0;

   if autoplay then
      play;

end;

destructor TKaraGLPlayer.Destroy;
begin
   command := ('close karagl wait');
  mciSendString(command, return, resultSize, 0);

  MIDI_Device := 0;
end;

function TKaraGLPlayer.getPosition: Integer;
begin
   command := ('status karagl position wait');
   mciSendString(command, return, resultSize, 0);
  if (StrLen(return) > 0) then
       result := StrToInt(return)
    else
    result := 0;

end;

procedure TKaraGLPlayer.pausePlay;
begin
    paused := not paused;

    if paused then
    begin
       command := ('pause karagl notify');
      mciSendString(command, return, resultSize, 0);
    end else
    begin
       command := ('resume karagl notify');
      mciSendString(command, return, resultSize, 0);
    end;
end;

procedure TKaraGLPlayer.play;
begin
   command := ('play karagl notify');
   mciSendString(command, return, resultSize, 0);

end;

procedure TKaraGLPlayer.stop;
begin
   command := ('stop karagl notify');
  mciSendString(command, return, resultSize, 0);

end;

end.
Wenn's hilft..
Den Rest bitte selber machen.

PS:
Delphi-Quellcode:
var
fileName: string;
MusicPlayer: TKaraGLPlayer;
...  
  OpenDialog1.Filter := 'Lyrics Dateien (*.kar;*.mid)|*.kar;*.mid';
  if OpenDialog1.Execute then
    fileName := OpenDialog1.FileName;

  MusicPlayer := TKaraGLPlayer.Create(fileName, true);
gruss

Magic94 13. Feb 2012 21:50

AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
 
also so schwer war das jetzt nicht zu verstehen ;-)

eine .mid Datei soll geladen werden (nicht abgespielt!!). Dann sollen von 2 ausgewählten Channeln die eigentlichen MIDIEreignisse in Frequenz und Länge umgewandelt werden und in ein Array gespeichert werden.

Kein Midi abspielen, keine Glaskugel befragen oder sonstiges

EWeiss 13. Feb 2012 21:54

AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
 
Zitat:

Zitat von Magic94 (Beitrag 1150915)
also so schwer war das jetzt nicht zu verstehen ;-)

eine .mid Datei soll geladen werden (nicht abgespielt!!). Dann sollen von 2 ausgewählten Channeln die eigentlichen MIDIEreignisse in Frequenz und Länge umgewandelt werden und in ein Array gespeichert werden.

Kein Midi abspielen, keine Glaskugel befragen oder sonstiges

Dann mach es doch.
Aber anscheinend hast keinen Plan und ich denke keiner macht das für dich.

Es sei denn du läßt was rüberspringen so in etwa 1 Riesen!
Denke du weist was ein Riese ist.

Ich bin dann raus aus dem Thread.

gruss

Sir Rufo 13. Feb 2012 21:57

AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
 
Ja dann mach das doch, oder hast du tatsächlich eine Frage?

Eine Frage, das ist dieses komische Gebilde mit dem Fragezeichen am Ende.

Magic94 13. Feb 2012 22:00

AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
 
Zitat:

Zitat von EWeiss (Beitrag 1150916)
Dann mach es doch.
Aber anscheinend hast keinen Plan und ich denke keiner macht das für dich.

Es sei denn du läßt was rüberspringen so in etwa 1 Riesen!
Denke du weist was ein Riese ist.

Ich bin dann raus aus dem Thread.

gruss

Oh wie nett, hauptsache auf den Newfags rumhacken.
Sorry das ich mich an eigentlich kompetente Hilfe wenden wollte um einen Ansatz zu bekommen bzw eine Komponente zu bekommen mit der so etwas leicht zu realisieren wäre.

EWeiss 13. Feb 2012 22:02

AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
 
Zitat:

Sorry das ich mich an eigentlich kompetente Hilfe wenden wollte um einen Ansatz zu bekommen bzw eine Komponente zu bekommen mit der so etwas leicht zu realisieren wäre.
Ok.. Eins noch!
Sorry das sich kein Kompetenter Mann/Frau hier finden läßt die DEINE Arbeit umsonst macht.

gruss

Sir Rufo 13. Feb 2012 22:06

AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
 
Zitat:

Zitat von Magic94 (Beitrag 1150919)
Oh wie nett, hauptsache auf den Newfags rumhacken.
Sorry das ich mich an eigentlich kompetente Hilfe wenden wollte um einen Ansatz zu bekommen bzw eine Komponente zu bekommen mit der so etwas leicht zu realisieren wäre.

Die bekommst du hier auch, aber dieses Ansinnen "Wer kennt eine Komponente/Unit mit der das möglich ist" konnte ich bislang nicht finden.

Aber Schuld sind immer die Anderen, genau :roll:

EDIT: Wenn dir einer etwas zu MIDI erzählen kann, dann ist das EWeiss. Das nennt man dann wohl Pech.

sx2008 14. Feb 2012 09:15

AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
 
Hier gibt es eine Umrechnungstabelle + Erklärung zum mathematischen Hintergrund:
http://www.phys.unsw.edu.au/jw/notes.html
Verwende ein Array um die Frequenzen abzulegen:
Delphi-Quellcode:
TMidiNoteFreqArray = array[21..108] of float;
const
 MidiNoteFreqArray : TMidiNoteFreqArray = (
27.5, ... {viele weitere Frequenzen hier}, 4186);
Man kann auch die Formeln verwenden, um alle Frequenzen zwischen MidiNote 0 bis 127 auszurechnen.


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