Seite 1 von 1

präzises Timing mit PB im Millisekunden-Bereich

Verfasst: 13.09.2009 12:18
von JayCool
Hi @ all,

ich benötige eine Möglichkeit, mit der ich ein genaues Timing im Bereich von 1 Millisekunde realisieren kann.

Ich dachte bis jetzt, mann könne das mit ElapsedMilliSeconds() machen, aber weit gefehlt.

Habe folgendes Programm zum Test erstellt:

Code: Alles auswählen

a = ElapsedMilliseconds()
Dim d$(100000)

For i = 1 To 100000
b = ElapsedMilliseconds()
d$(i) = Str(i) + ": "+ Str(b-a)
;Debug d$
Next i
For i = 1 To 100000
Debug d$(i)
Next i
End
Man sollte denken, dass die Zeit (siehe "Str(b-a)" in der 3. Programmzeile in kleinen Schritten von höchstens 1 ms hochzählt. Tuts aber nicht!
Stattdessen wird immer wieder dieselbe Zeit neben den Zähler geschrieben, also zuerst mal eine Weile 0, dann eine Weile 15, dann eine Weile 31.

Ich dachte zunächst, dass das Ganze an meinem verhältnismäßig langsamen Rechner (Samsung NC10, CPU Atom N270, 1600 MHz) liegt.
Damit hängts aber nicht zusammen. Hab' das Ganze mal im Energiesparmodus bei 800 MHz probiert. Sieht dann jedoch genauso aus, nur dass er dann nur halb so viele Zähler mit 0, 15 usw. macht.
Nächster Versuch war mit 'nem viel schnelleren Rechner: Mein dienstlicher Lenovo ThinkPad T61 mit CPU irgendwas DualCore.
Resultat: Keine Änderung: Zählt auch eine Weile mit Zeit 0, dann Sprung auf 16, dann 31 ....

Wers ausprobieren will, der muss, abhängig von der CPU-Geschwindigkeit die Maximalanzahl der Durchläufe etwas anpassen. Beim NC10 reichen 10000 Durchläufe, beim T61 hab ichs mit 100000 probiert.

Hat vielleicht jemand von Euch einen Workaround für das beschriebene Problem????

Für die Frage, warum ich so ein genaues Timing brauche:
Hat mit MIDI zu tun. Hab' mir zum NC10 einen USB-Seriell-Adapter geholt und möchte den NC10 zwischen Masterkeyboard und SoundExpander (Für den Laien: externer Synthesizer) schalten, um Sequencing zu machen, und den MIDI-Datenstrom manipulieren zu können.
Ach ja, MIDI läuft mit PC-untypischen 31250 Bit/s. Werd' mir deshalb noch nen Adapter mit 'nem PIC bauen.
Ein NoteOn-Befehl braucht dabei 2 Byte. Mit den entsprechenden Start- und Stopp-Bits kommt man dann so roundabout auf 0,6 ms, deshalb die Genauigkeit.

gr33tz JayCool

Re: präzises Timing mit PB im Millisekunden-Bereich

Verfasst: 13.09.2009 12:25
von ts-soft

Re: präzises Timing mit PB im Millisekunden-Bereich

Verfasst: 13.09.2009 12:35
von Kaeru Gaman
Hat mit MIDI zu tun.
da bist du vielleicht besser bedient, über die DirectSound API zu gehen. ich kenne sie selber nicht wirklich,
aber da Midi schon seit Jahren zuverlässig funktioniert ohne dass man sich mit Timern nen Wolf coden muss,
gehe ich davon aus, dass der MIDI-Chip auf der Soundkarte selber Timer-Fähigkeiten besitzt und das alleine
besser händeln kann, als dass man die CPU damit belästigt.

Re: präzises Timing mit PB im Millisekunden-Bereich

Verfasst: 13.09.2009 15:48
von JayCool
@ ts-soft:
vielen Dank für den Tipp! Jetzt läuft es wie gewünscht! Ich kapier zwar nicht, was in dem Beispiel von deinem ersten Link abgeht, aber Hauptsache ist, dass es läuft.


@ Kaeru Gaman:
Mir fehlt leider der intellektuelle Zugang zur (DirectSound) API. Kannst Du mir eventuell ein gutes Buch empfehlen, das dem Laien verständlich erklärt, wie man bei der API-Programmierung vorgehen muss? Ich befürchte aber, dass es sowas für PureBasic nicht geben wird. Andere Programmiersprachen - außer MICROCHIP-PIC-Assembler für die Mikrocontroller der PIC-12F- und PIC-16F-Baureihen - kenne ich leider nicht.
Außerdem will ich nicht die Soundkarte in meinem Rechner verwenden, sondern den Rechner nur nutzen, um die MIDI-Daten zu manipulieren.
Datenstrom soll dabei wie folgt gehen:
Keyboard (Fatar Studiologic SL880)=> Samsung NC10 => SoundExpander (Roland JV1010) => Verstärker (AKAI irgendwas) => Ohr (MySelf) => Gehirn (MySelf, too)