AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Magic94 · begonnen am 12. Feb 2012 · letzter Beitrag vom 14. Feb 2012
Antwort Antwort
Magic94

Registriert seit: 21. Nov 2010
31 Beiträge
 
Delphi 7 Personal
 
#1

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

  Alt 12. Feb 2012, 15:58
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/
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

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

  Alt 13. Feb 2012, 07:57
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

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

  Alt 13. Feb 2012, 17:56
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

Geändert von EWeiss (13. Feb 2012 um 18:43 Uhr)
  Mit Zitat antworten Zitat
Magic94

Registriert seit: 21. Nov 2010
31 Beiträge
 
Delphi 7 Personal
 
#4

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

  Alt 13. Feb 2012, 22:50
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

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

  Alt 13. Feb 2012, 22:54
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

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

  Alt 13. Feb 2012, 22:57
Ja dann mach das doch, oder hast du tatsächlich eine Frage?

Eine Frage, das ist dieses komische Gebilde mit dem Fragezeichen am Ende.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Magic94

Registriert seit: 21. Nov 2010
31 Beiträge
 
Delphi 7 Personal
 
#7

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

  Alt 13. Feb 2012, 23:00
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

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

  Alt 13. Feb 2012, 23:02
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

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

  Alt 13. Feb 2012, 23:06
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

EDIT: Wenn dir einer etwas zu MIDI erzählen kann, dann ist das EWeiss. Das nennt man dann wohl Pech.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (13. Feb 2012 um 23:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#10

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

  Alt 14. Feb 2012, 10:15
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.
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 18:48 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