1

Aloha,
Czy jest ktoś na tym forum kto programował replayera do plików midi i wie jak obsłużyć wysyłanie eventów na podstawie czasów delta? Jestem w stanie przełożyć delty na czas rzeczywisty, ale za bardzo nie mam pomysłu jak przełożyć to "na MFP".
Generalnie potrzebne mi jest obliczenie częstotliwości(w hercach) do zapodania mfp (ustawienia to już mam), żeby przerwanie wywoływało się co jedno tyknięcie delty.
Czas 1 delty (w przeliczeniu na czas rzeczywisty) jest obliczane w jakiś magiczny sposób za pomocą danych wyjętych z pliku midi (mam czas trwania ćwierć nuty w mikrosekundach oraz ilość tyknięć na ćwierć nutę (tzw. PPQN- pulses per quaternote)).  Mam jeszcze sygnaturę czasową (np. 4/4, 4/8 etc), ale ona podobno jest raczej do niczego nie potrzebna(oprócz liczenia sobie barów).

Liczę sobie to obecnie tak:
  float freq=500 000(czas trwania ćwierć nuty)/1000000.0f = 0,5s;
  freq=freq/pCurrentSequence->timeDivision;
 
  //calculate freq in [hz]
  freq=1.0f/freq;   

Problem w tym, że to tempo jest zdecydowanie za wolne (ok. ~4 razy).  Niestety jestem dyslicznikiem z dyskalkulią czy ktoś może mnie oświecić jak uzyskać ludzkie tempo?

pzdr,
saulot

=========================================
[www] https://nokturnal.pl
[ 16/32 bit Atari development wiki] https://bus-error.nokturnal.pl

2 Ostatnio edytowany przez Cyprian (2012-05-08 01:36:50)

skąd wziąłeś te "500 000" dla czas trwania ćwierć nuty? nie powinna to być zmienna zależna od Tempa?
Tempo definiuje ilość ćwierćnut na minutę. Tak więc im większe tempo, tym więcej ćwierćnut w minucie i tym krótszy czas ich trwania.
Zobacz czy to nie będzie pomocne: http://home.roadrunner.com/~jgglatt/tec … e/ppqn.htm


btw. ostatni raz 15 lat temu bawiłem się programowaniem MIDI, mam jeszcze gdzieś ze dwie książki ze specyfikacją formatu.

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

3

znam tą stronę. 500 000 to jest defaultowa wartość dla tempa (podałem to jako przykład) tak jak defaultowy ppqn jest 120. Długość ćwierć nuty jest ustawiana przez event set tempo przy odgrywaniu utworu.
Znam specyfikację formatu, mi raczej chodzi o prawidłowy sposób implementacji obsługi tempa. Przeliczanie na czas rzeczywisty eventów jest wg wzoru:

float freq=500 000(czas trwania ćwierć nuty w mikrosekundach)/1000000.0f = 0,5s; (ilość sekund na ćwierć nutę )
sekundNaTyknięcie=freq/pCurrentSequence->timeDivision (np. 120 ppqn); - ilość sekund na tyknięcie
czas delta w sekundach = czas delta eventu z pliku midi * sekundNaTyknięcie. 

no i ten czas delty w sekundach musze przerobić jakoś na częstotliwość dla mfp dla 1 delty.  freq=1.0f/freq;   nie daje dobrego rezultatu.

=========================================
[www] https://nokturnal.pl
[ 16/32 bit Atari development wiki] https://bus-error.nokturnal.pl

4 Ostatnio edytowany przez Cyprian (2012-05-08 03:16:03)

ok,
mamy obliczoną deltę, powiedzmy że jest to 0.5 sekundy
Teraz obliczył bym ile to jest w tikach MFP (2.4576MHz ). 2457600 * 0.5 = 1 228 800 tików - po tylu tikach MFP chcemy wywołać przerwanie.

Trzeba teraz to przełożyć na rejesty MFP:
- Divider - 4/10/16/50/64/100/200
- Timer Data Register: max 256 tików

Maksymalny odstęp pomiędzy przerwaniami to Divider * Timer Data Register: 200 * 256 = 51200
1228800 / 51200 = 24

Wychodzi na to że potrzeba więc przynajmniej 24 przerwania na tą deltę (0.5 sekundy)

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

5

Cyprian: czas ćwierć nuty to nie delta. Mi jest potrzebna częstotliwość z jaką ma być inkrementacja delty, dane do rejestrów MFP na podstawie zadanej częstotliwości umiem sobie dobrać. No nic, może popiszę po autorach sekwencerów midi. Dzięki.

=========================================
[www] https://nokturnal.pl
[ 16/32 bit Atari development wiki] https://bus-error.nokturnal.pl

6

dobra to od początku.
tempo (BPS) oblicza się z metrum (u Ciebie "sygnaturę czasową") oraz czasu trwania ćwierćnuty. Ale rozumiem że BPS Ciebie nie interesują.

Jeśli dobrze zrozumiałem interesuje Ciebie realny czas trwania delty (w celu przełożenia tego na MPF).
Czas trwania Delty = Ilość tików z Delty * czas trwania jednego tiku.
Czas trwania jednego tiku = realny czas trwania ćwierćnuty /  PPQN.

Teraz jak wyciągnąć ilość tików z Delty.
Delta jak i PPQN kodowane są 7bitowo. Czyli najstarszy bit jest kontrolny, pozostałe 7 bitów niesie dane. Bit kontrolny zapalony jest we wszystkich bajtach oprócz ostatniego.

przykładowo:
0x81 0x7F                  to wartość  255 (0xFF)
0x82 0x80 0x00          to wartość  32768 (0x8000)


Czy o to chodziło?

jest jeszcze jeden myk, czas może być mierzony w SMPTE  zamiast w tikach PPQN

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

7

Cyprian: Chodzi mi głównie o częstotliwość z jaką inkrementowana jest 1 delta. Jak będę miał poprawny, stały czas update'u to będę w domu.

=========================================
[www] https://nokturnal.pl
[ 16/32 bit Atari development wiki] https://bus-error.nokturnal.pl

8

ale Delta nie jest stała, ma długość od bajtu do czterech bajtów więć może zawierać różną ilość tików.
Delta też nie pojawia się w stałych odstępach w strumieniu MIDI, więc nie ma swojej jednej częstotliwości.
Pomiędzy deltami może być jedna instrukcja ( jeśli uderzysz jeden klawisz),10 (dziesięć klawiszy na raz) albo i więcej (głośność, zmiana brzmienia, sy-exclusive itp.).
Trzeba na bierząco monitorować strumień MIDI, od Delty do Delty.
Ważne że czas trwania tiku jest stały i na jego podstawie możemy wyliczyć czas trwania konkretnej Delty

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

9

wiem że delta nie jest stała. Delta jest relatywna w czasie do poprzednich eventów w strumieniu. Racja, tempo się zmienia w czasie i za każdym razem gdy jest zmieniane czas trwania delty także ulega zmianie. Ale nie zgodzę się, że nie da się obliczyć jej częstotliwości dla określonego tempa w danej chwili czasu.

P.S. Chyba mam już rozwiązanie, ale muszę to najpierw sprawdzić.

=========================================
[www] https://nokturnal.pl
[ 16/32 bit Atari development wiki] https://bus-error.nokturnal.pl

10 Ostatnio edytowany przez Cyprian (2012-05-10 01:17:51)

właśnie przyszło mi do głowy że może my mówimy o tym samym ale poniekąd o czymś innym :)
Mi chodziło o plik w formacie MIDI. Dane z niego  nie są dosłownym zrzutem danych z transmisji MIDI poprzez kabel.
O ile się nie mylę to kod Delta czasu występuje tylko w pliku, a w transmisji jej odpowiednikiem jest Midi Clock, który chyba nadawany jest z określoną częstotliwością.

Niżej są dane z jednej ścieżki pliku midi - trzy dźwięki i pauza: Ćwierćnuta, Ćwierćnuta, Pauza ćwierćnutowa, Ćwierćnuta. Nawiasem kwadratowym oznaczyłem kody Delty czasu, jak widać w PLIKU występują one nieregularnie więc nie można wyciągnąć z nich/dla nich jednej częstotliwości:


[8C 00]    90 6C 20    [83 00]    [80 6C]    20 00    90 6C 20    [83 00]    [80 6C]    20    [83 00]    90 6C 20    [83 00]    [80 6C]     20 01    FF 2F 00

Przypuszczam że chodziło Tobie o transmisję MIDI po kablu, tam kod Midi Clock powinien być regularny.

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

11 Ostatnio edytowany przez saulot (2012-05-10 11:44:33)

midi clock jest opcjonalny i jest to wysyłanie co pewien stały interwał czasu sygnału do urządzeń midi (jeden bajt, (chyba 0xf8 i parę innych) ma sens jak jest podłączonych więcej urządzeń, ja programuję pod jeden moduł. Chodzi o to, żeby n urządzeń było zsynchronizowanych w czasie.
Delty w pliku muszą być przy każdym evencie w ścieżce, nie ma innej opcji. Tak delta występuje tylko w plikach midi. Gdyby nie dało się ustalić jakiejś częstotliwości 1 delty to myślisz, że jak sekwencery obsługiwałyby te wszystkie zdarzenia?

=========================================
[www] https://nokturnal.pl
[ 16/32 bit Atari development wiki] https://bus-error.nokturnal.pl

12

tak tak, po prostu próbowałem ustalić czy mówimy o tym samym - danych MIDI z pliku:
Co sądzisz to tym przykładzie pliku MIDI:

[8C 00]    90 6C 20    [83 00]    [80 6C]    20 00    90 6C 20    [83 00]    [80 6C]    20    [83 00]    90 6C 20    [83 00]    [80 6C]     20 01    FF 2F 00

Chodzi mi o tą deltę i jej częstotliwości. I co da jej obliczenie?

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

13

To jest mi akurat potrzebne przy odgrywaniu eventów midi z kilku ścieżek. Muszę mieć śledzenie delt dla każdej ścieżki. Jak mam dane w jednej ścieżce to z przeliczaniem delt problemu jest trochę inny (przerwania mogę zrobić rzadsze, delta eventu * okres 1 delty).
W załączniku jest log z mojego parsera dla pliku midi 1.

Post's attachments

AMIDI.LOG 126.33 kb, liczba pobrań: 2 (od 2012-05-10) 

Tylko zalogowani mogą pobierać załączniki.
=========================================
[www] https://nokturnal.pl
[ 16/32 bit Atari development wiki] https://bus-error.nokturnal.pl