MIDI Timecode

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Sorn
Beiträge: 17
Registriert: 13.02.2008 17:30

MIDI Timecode

Beitrag von Sorn »

Hallo

Zur Zeit versuche ich mich in MIDI-Timecode Programmierung.
Vom Prinzip funktioniert das auch.
Jetzt ist es so, dass es verschiedene Framerates gibt:
24
25
30 mit und ohne Framedrop

Die meisten Timer haben nur eine Auflösung von 1ms
Wenn ich pro 1000ms 30 Frames habe, muss ich alle
33.3333ms etc ein Framesignal schicken. Nun Kommastellen kann
ich ja wohl nicht angeben, wie soll ich so etwas also lösen?
Ich kann wohl nur alle 33ms ein Signal abschicken.
Erst wenn die Kommastellen wieder ein ganzes Frame ergeben, kann
ich dieses einfügen.

Ist das die normale Vorgehensweise?
Sorn
Beiträge: 17
Registriert: 13.02.2008 17:30

Beitrag von Sorn »

Anhand der überwältigenden Anzahl Eurer Antworten :roll:
ziehe ich den Schluss, dass niemand so recht weiß was ich
überhaupt will. :freak:

Inzwischen habe ich mal versucht so eine Art PLL Routine zu
schreiben. Das heißt ich lasse einen Zähler laufen, der immer
mal wieder von einem Timer synchronisiert wird. Dadurch
erhoffte ich mir eine feinere Unterteilung meiner Frames.
Da ich Windows-Messages zwischen drin abfragen muss,
bin ich natürlich genau so nass wie zuvor. Allein schon
wenn ich die Maus bewege wird natürlich mein Zähler
langsamer.
Hat jemand eine Idee, wie man eine ungerade Anzahl Frames
mit den vorhandenen Timermöglichkeiten erzeugen kann?
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

Nimm doch einfach 25. Das sind dann 40ms.
GetTickCount_() und Co. sollten doch nicht von ner Mausbewegung beeinflusst werden.
Kenn mich da aber nicht so aus.

Wofür brauchst du eigentlich so einen genauen Timer? Midi ist doch eventbasiert, dachte ich. Da gibt es doch Note_On und Note_Off bzw. Note_0 bis Note_127.

Wenn du da ein Callback machst, dann isses doch egal, ob der Befehl jetzt 13ms früher oder später ankommt.
Sorn
Beiträge: 17
Registriert: 13.02.2008 17:30

Beitrag von Sorn »

Danke für deinen Beitrag :)

Klar 25 wird wohl eher die Framerate der Wahl werden.

Ich möchte gerne eine Animation eines 3D Programms mit Hilfe
von MIDI-Time-Code (MTC) mit einem Audioprogramm
wie Wavelab synchronisieren. Hierzu müssen hh:mm:ss:ff
in einem bestimmten Format über die MIDI-Schnittstelle
geschickt werden.

Nun bin ich auf zwei Probleme gestoßen, die ich bisher noch
nicht lösen konnte:

Einmal die angesprochene Sache mit den ungeraden Frames
und dann noch etwas, was mir sogar noch mehr Kopfzerbrechen
bereitet. Etliche meiner gesendeten Bytes gehen einfach verloren.

Wenn ich Wavelab mit Cubase synchronisiere läuft alles glatt,
wenn ich aber meine selbst geschriebenen Routinen nehme,
bleiben einzelne Daten auf der Strecke, und die Synchronisation
ist dahin.
Zuerst baute ich die Routine in VB6, als dann aber dieses Problem
auftauchte, dachte ich es könnte sich um ein VB6 Problem handeln.
Daraufhin habe ich es mit PureBasic versucht, kam aber zu dem
gleichen Ergebnis.

Nun dachte ich, beide Probleme könnten auf der gleichen Ursache
beruhen, nämlich ungenaues Timing. Das könnte ich aber nur
herausfinden, wenn ich ein noch genaueres Timing hätte mit dem
ich meine Daten vergleichen könnte.

Warum Cubase es schafft die Daten so genau zu schicken bleibt
für mich auch noch ein Rätsel. Wer weiß, vielleicht verwenden sie
ja gar nicht die regulären API-Routinen zum Senden der MIDI-Daten
sondern haben sich selbst hardwarenahe Routinen geschrieben.


So, das war jetzt die Langform der Erklärung. :oops:
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

Es gibt doch für Audioprogramme den ASIO-Standard. Der garantiert doch eine sehr geringe Latenz. Ich bin mir allerdings nicht sicher, ob der auch für Midi nutzbar ist, oder nur für Audiosignale.

Das ist ne Live-Animation? Zu nem Live DJ-Set oder so?

Und wo hast du dein Programm? Beim senden von MTC oder beim empfangen?

Vielleicht sendest du auch einfach zu viel auf einmal? Wenn 20 Kanäle hast und die immer nacheinander an und aus gehen gibt's kein Problem. Aber wenn die alle gleichzeitig funken isses klar, das was verloren geht. (je nachdem wie viele Kanäle halt unterstützt werden)
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Beitrag von Falko »

Vielleicht hilft dieses hier weiter.

QueryPerformanceCounter

Damit dürfte man eine Auflösung von 1/1000 Millisekunde
erzeugen können.

Ob es auf jeden Rechner funktioniert weiß ich nicht.

Gruß Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Sorn
Beiträge: 17
Registriert: 13.02.2008 17:30

Beitrag von Sorn »

TomS hat geschrieben:Es gibt doch für Audioprogramme den ASIO-Standard. Der garantiert doch eine sehr geringe Latenz. Ich bin mir allerdings nicht sicher, ob der auch für Midi nutzbar ist, oder nur für Audiosignale.
Ich auch nicht, da müsste ich mal nach der Spezifikation suchen

Das ist ne Live-Animation? Zu nem Live DJ-Set oder so?

Eigentlich nicht, das Audioprogramm soll beim Erstellen einer Animation von Mundbewegungen immer zur richtigen Zeit springen
Und wo hast du dein Programm? Beim senden von MTC oder beim empfangen?

Es soll vom Animationsprogramm mittels VBScript eine DLL aufrufen, die dann das Audioprogramm synchronisiert. Natürlich weiß ich bis jetzt noch nicht, ob das so überhaupt klappen kann. Schließlich sind Scripts auch nicht grade die schnellsten.
Vielleicht sendest du auch einfach zu viel auf einmal? Wenn 20 Kanäle hast und die immer nacheinander an und aus gehen gibt's kein Problem. Aber wenn die alle gleichzeitig funken isses klar, das was verloren geht. (je nachdem wie viele Kanäle halt unterstützt werden)
Ich habe schon mal versucht langsamer zu senden, da gab es aber auch
Aussetzer.
Sorn
Beiträge: 17
Registriert: 13.02.2008 17:30

Beitrag von Sorn »

Falko hat geschrieben:Vielleicht hilft dieses hier weiter.

QueryPerformanceCounter

Damit dürfte man eine Auflösung von 1/1000 Millisekunde
erzeugen können.

Ob es auf jeden Rechner funktioniert weiß ich nicht.

Gruß Falko
Ja, das wollte ich auch mal noch checken, aber das ist so viel ich
weiß kein Timer der events oder interupts oder wie man das auch immer nennt sendet, sondern ich muss ihn
immer abfragen. Mal sehen...
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

Also wenn es eh nicht auf Echtzeit ankommt, warum dann MTC verwenden? Warum nicht einfach ein Script in Textform?

Code: Alles auswählen

keyframe3    wort1_silbe1.wav
keyframe6    wort1_silbe2.wav
usw...

Oder direkt mit nem Videoprogramm.
Sorn
Beiträge: 17
Registriert: 13.02.2008 17:30

Beitrag von Sorn »

jetzt verstehe ich erst richtig was du mit Live Animation gemeint hattest.

Nein. es soll schon parallel mitlaufen, also in Echtzeit.
Es gäbe ja noch einen anderen MIDI Befehl, der gibt dann nur die absolute Zeit an, zu der
gesprungen werden soll. Das will ich jedenfalls noch probieren.

Und zudem will ich ja erst mal eine fortlaufende Audiodatei und eine
fortlaufende 3D Animation. Den Rest kann dann Wavelab erledigen.

Das frage ich mich aber auch schon die ganze Zeit, wie Videoprogramme
das machen, wie bringen die denn ungerade Frames in eine Sekunde
Laufzeit. Bei denen wird es wohl egal sein, da der Ton dann halt auch
etwas zu schnell oder zu langsam ist. (Mit Nero bringe ich sowie so
keine Audiodaten mit Videodaten synchron, aber das ist ein anderes Thema)
Antworten