![]() |
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:
gepackt werden.
playArray: array of array of integer;
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:
wer sich das jetzige Programm mal anschauen will:
SetLength(playArray,3);
SetLength(playArray[0],....); SetLength(playArray[1].....); SetLength(playArray[2],....); ![]() |
AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
Ich weiß irgendwie nicht, was du jetzt möchtest. Willst du
|
AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
Zitat:
Hier mal ne kleine Unit von mir auf mmsystem aufgebaut.
Delphi-Quellcode:
Wenn's hilft..
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. Den Rest bitte selber machen. PS:
Delphi-Quellcode:
gruss
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); |
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 |
AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
Zitat:
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 |
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. |
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. |
AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
Zitat:
Sorry das sich kein Kompetenter Mann/Frau hier finden läßt die DEINE Arbeit umsonst macht. gruss |
AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
Zitat:
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. |
AW: MIDI öffnen und zu Frequenz (hz) und Länge(ms) konvertieren
Hier gibt es eine Umrechnungstabelle + Erklärung zum mathematischen Hintergrund:
![]() Verwende ein Array um die Frequenzen abzulegen:
Delphi-Quellcode:
Man kann auch die Formeln verwenden, um alle Frequenzen zwischen MidiNote 0 bis 127 auszurechnen.
TMidiNoteFreqArray = array[21..108] of float;
const MidiNoteFreqArray : TMidiNoteFreqArray = ( 27.5, ... {viele weitere Frequenzen hier}, 4186); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz