präzises Timing mit PB im Millisekunden-Bereich

Für allgemeine Fragen zur Programmierung mit PureBasic.
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

präzises Timing mit PB im Millisekunden-Bereich

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag von ts-soft »

Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

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

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

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

Beitrag 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)
Antworten