DBM (format pliku)

DBM – format pliku modułów muzycznych używany przez program DIGIBooster Pro. Struktura formatu oparta jest na samoopisujących się blokach, zwanych chunkami, podobnie jak w formatach-kontenerach IFF, czy RIFF. Każdy z bloków rozpoczyna się czterobajtowym identyfikatorem, identyfikator to cztery wielkie litery w kodzie ASCII. Po identyfikatorze następuje 32-bitowa liczba określająca długość zawartości bloku (bez uwzględnienia 8 bajtów zajmowanych przez identyfikator i pole długości). W formacie DBM wszystkie liczby wielobajtowe są zapisane w konwencji big endian (od najstarszego do najmłodszego bajtu). Jeżeli chodzi o teksty zapisane w module (np. jego nazwa, nazwy utworów i instrumentów), nie zakłada się żadnej konkretnej strony kodowej. Najczęściej jest to standardowa dla Amigi strona ECMA Latin-1 czyli ISO-8859-1.

Ogólna budowa modułu

Moduł w formacie DBM zawiera kilka następujących po sobie bloków o następujących identyfikatorach:

  • NAME – nazwa modułu.
  • INFO – podstawowe informacje o module, takie jak liczba ścieżek dźwiękowych, instrumentów, czy tabel sekwencera.
  • PATT – tabele sekwencera (ang. patterns), a więc zapis muzyczny utworu zawierający nuty, numery instrumentów oraz efekty dźwiękowe i sterujące.
  • SONG – informacje o utworach zapisanych w module oraz kolejność odtwarzania tabel sekwencera. Z reguły moduł zawiera jeden utwór, ale może ich być więcej.
  • INST – informacje o instrumentach, takie jak głośność, panorama stereo, obwiednie, pętle itp.
  • SMPL – z reguły najdłuższy blok, zawiera próbki dźwięku zapisane jako PCM.
  • VENV – blok opcjonalny, zawiera definicje obwiedni głośności instrumentów.
  • PENV – blok opcjonalny, zawiera definicje obwiedni panoramy stereo instrumentów.

Kolejność bloków w module jest dowolna, z zastrzeżeniem, że przed blokiem INFO może występować jedynie blok NAME.

Szczegółowy opis bloków

Na początku każdego modułu występuje ośmiobajtowy nagłówek, składający się z następujących pól:

PoczątekDługośćZnaczenie
04Identyfikator formatu, ciąg "DBM0".
41Wersja programu, który zapisał moduł. Liczba dwucyfrowa zakodowana w kodzie BCD.
51Rewizja programu, który zapisał moduł. Liczba dwucyfrowa zakodowana w kodzie BCD. Przykładowo, zapis $02 $21 oznacza wersję 2.21 DigiBoostera.
62Zarezerwowane, zawsze 0.

Blok NAME

PoczątekDługośćZnaczenie
04Identyfikator bloku, ciąg "NAME".
44Długość następujących danych w bajtach. Dla tego bloku zawsze 44.
844Nazwa modułu. Jeżeli jest krótsza, jest uzupełniona bajtami 0. Jeżeli ma dokładnie 44 znaki, nie posiada na końcu bajtu 0.

Blok NAME ma stałą długość 52 bajtów.

Blok INFO

PoczątekDługośćZnaczenie
04Identyfikator bloku, ciąg "INFO".
44Długość następujących danych w bajtach. Dla tego bloku zawsze 10.
82Liczba instrumentów w module. Maksymalnie 255.
102Liczba próbek dźwiękowych (sampli) w module. Maksymalnie 256.
122Liczba utworów w module. DigiBooster Pro 2.x ogranicza tę liczbę do 5.
142Liczba tablic sekwencera (patternów) w module. Maksymalnie 1024.
162Liczba ścieżek dźwiękowych w module, od 2 do 128 włącznie (zawsze parzysta).

Blok INFO ma stałą długość 18 bajtów.

Blok SONG

PoczątekDługośćZnaczenie
04Identyfikator bloku, ciąg "SONG".
44Długość następujących danych w bajtach. Zmienna.

Po nagłówku następują zapisane kolejno po sobie definicje utworów modułu. Liczba definicji zgodna jest z liczbą utworów zapisaną w bloku INFO. Pojedyncza definicja ma następującą budowę:

PoczątekDługośćZnaczenie
044Tytuł utworu. Jeżeli krótszy niż 44 znaki uzupełniony bajtami 0. Jeżeli ma dokładnie 44 znaki, nie jest zakończony bajtem 0.
442Długość utworu, czyli liczba kolejno odtwarzanych tabel sekwencera (patternów).
46zmiennaLista odtwarzania zawierająca numery kolejno odtwarzanych patternów. Numery zaczynają się od 0 i odpowiadają ściśle kolejności zapisania patternów w bloku PATT. Każda pozycja listy jest liczbą 16-bitową bez znaku. Ilość tych liczb odpowiada długości utworu powyżej.

Blok INST

PoczątekDługośćZnaczenie
04Identyfikator bloku, ciąg "INST".
44Długość następujących danych w bajtach. Zmienna (50 × liczba instrumentów).

Po nagłówku następują zapisane kolejno po sobie definicje instrumentów. Liczba definicji zgodna jest z liczbą instrumentów zapisaną w bloku INFO. Pojedyncza definicja ma długość 50 bajtów i następującą budowę:

PoczątekDługośćZnaczenie
030Nazwa instrumentu. Jeżeli krótsza od 30 znaków, uzupełniona bajtami 0. Jeżeli ma równo 30 znaków, nie posiada kończącego bajtu 0.
302Numer kolejny próbki dźwiękowej używanej przez instrument. Odpowiada kolejności próbek w bloku SMPL, liczonej od 1.
322Domyślna głośność instrumentu, w skali od 0 do 64 włącznie.
344Bazowa częstotliwość próbkowania. Częstotliwość z jaką należy odtwarzać instrument, aby uzyskać nutę C-4.
384Początek pętli – numer (liczony od 0) pierwszej próbki PCM znajdującej się w pętli.
424Liczba próbek PCM w pętli.
462Domyślna panorama stereo od -128 (kanał lewy) do +128 (kanał prawy).
482Rodzaj pętli: 0 = brak pętli, 1 = pętla do przodu, 2 = pętla dwukierunkowa ("ping-pong").

Blok SMPL

PoczątekDługośćZnaczenie
04Identyfikator bloku, ciąg "SMPL".
44Długość następujących danych w bajtach. Zmienna.

Po nagłówku następują zapisane kolejno po sobie próbki dźwiękowe, każda poprzedzona własnym 8-bajtowym nagłówkiem. Liczba próbek dźwiękowych zgodna jest z liczbą zapisaną w bloku INFO. Pojedyncza próbka jest zapisana następująco:

PoczątekDługośćZnaczenie
04Rodzaj kodowania PCM: 1 = 8-bitowe, 2 = 16-bitowe, 4 = 32-bitowe.
44Liczba próbek PCM.
8zmiennaPróbki PCM zapisane jako liczby całkowite ze znakiem.

Blok PATT

PoczątekDługośćZnaczenie
04Identyfikator bloku, ciąg "PATT".
44Długość następujących danych w bajtach. Zmienna.

Po nagłówku następują zapisane kolejno po sobie tablice sekwencera (patterny). Liczba tablic zgodna jest z liczbą zapisaną w bloku INFO. Pojedyncza tablica jest zapisana w następujący sposób:

PoczątekDługośćZnaczenie
02Liczba wierszy tablicy (patternu).
24Długość spakowanych danych tablicy w bajtach. Zmienna.
6zmiennaSpakowane dane tablicy (patternu).

Dane tablicy sekwencera (patternu) są spakowane bardzo prostym algorytmem, opierającym się na założeniu, że większość pól tablicy jest pusta (zawiera zera). Zapisywane są wyłącznie niezerowe pola, co pozwala na spore oszczędności. Pierwszym bajtem pola jest zawsze numer ścieżki. Bajt $00 ma znaczenie specjalne i oznacza natychmiastowe przejście do nowego wiersza. W związku z tym, ścieżki numerowane są od 1. Po numerze ścieżki następuje bajt, którego 6 najmłodszych bitów sygnalizuje obecność kolejno (od najmłodszego bitu) nuty, numeru instrumentu, pierwszej komendy, parametru pierwszej komendy, drugiej komendy i parametru tejże. Bit "0" na danej pozycji oznacza, że odpowiednia wartość jest zerem i nie została zapisana. Nuta zapisana jest w jednym bajcie podzielonym na dwa czterobitowe pola. Starsze 4 bity zawierają numer oktawy (od 1 do 8), młodsze zawierają numer półtonu w oktawie (od 0 do 11, z tym, że ósma oktawa jest niepełna, DigiBooster formalnie obsługuje 7 oktaw). Instrumenty numerowane są od 1. Oto przykład początku tablicy:

$00 – przejście do wiersza 1, wiersz 0 jest cały pusty.

$06 $03 $52 $02 – ścieżka 6, nuta i instrument, nuta D-5, instrument 2. W zapisie trackerowym: D-5 02 000 000

$00 – przejście do wiersza 2, zatem wiersz 1 zawiera dane wyłącznie na ścieżce 6.

$03 $31 $36 $0F $70 – ścieżka 3, nuta, komenda 2, parametr 2. Nuta to F#3, komenda F70. W zapisie trackerowym: F#3 00 000 F70.

Jeżeli spakowane dane patternu liczą sobie nieparzystą liczbę bajtów, są uzupełniane bajtem $00, który nie jest wliczany do długości podanej w nagłówku patternu, ale jest wliczany w długość całego bloku PATT. Kolejność ścieżek w danych jednego wiersza jest teoretycznie dowolna, ale zawsze zapisywane są od lewej do prawej. W przypadku, gdy w danym wierszu występują dane w każdej ścieżce, na zakończenie wiersza i tak umieszczony jest kod $00.

Bloki VENV i PENV

Ze względu na prawie identyczną strukturę obu tych bloków, są one opisane łącznie. Blok VENV zawiera obwiednie głośności dla instrumentów, blok PENV obwiednie panoramy stereo. Oś czasu obwiedni jest wyskalowana w tzw. tickach, których czas trwania zależy od tempa modułu. Dla standardowego tempa 125 bpm jeden tick trwa 0,02 s. Wartości punktów obwiedni (na osi pionowej) są z zakresu od 0 (cisza) do 64 (pełna głośność) dla obwiedni głośności, oraz od -128 (tylko kanał lewy) do +128 (tylko kanał prawy) dla obwiedni panoramy. Każda obwiednia może posiadać pętlę oraz dwa punkty wybrzmiewania (ang. sustain). Opuszczenie pętli lub punktu wybrzmiewania następuje po napotkaniu komendy key off w zapisie muzycznym. A oto budowa wewnętrzna bloków:

PoczątekDługośćZnaczenie
04Identyfikator bloku, ciąg "VENV" lub "PENV"
44Długość następujących danych w bajtach. Zmienna, 136 × liczba obwiedni + 2.
82Liczba obwiedni w bloku.

Po nagłówku zapisane są kolejne obwiednie. Każda obwiednia zajmuje 136 bajtów, sposób zapisu jest następujący:

PoczątekDługośćZnaczenie
02Numer instrumentu (od 1) do którego przypisana jest obwiednia.
21Pole bitowe. Ustawienie poszczególnych bitów ma następujące znaczenie:
  • bit 0 (najmłodszy) – obwiednia jest aktywna,
  • bit 1 – obwiednia posiada pierwszy punkt wybrzmiewania,
  • bit 2 – obwiednia posiada pętlę,
  • bit 3 – obwiednia posiada drugi punkt wybrzmiewania.
31Liczba punktów obwiedni (nie więcej niż 32).
41Numer punktu obwiedni będącego pierwszym punktem wybrzmiewania.
51Numer punktu obwiedni będącego początkiem pętli.
61Numer punktu obwiedni będącego końcem pętli.
71Numer punktu obwiedni będącego drugim punktem wybrzmiewania.
82Pierwszy punkt obwiedni: położenie w czasie od momentu zagrania nuty (w tickach).
102Pierwszy punkt obwiedni: wartość.

Dalej następuje kolejne 31 punktów obwiedni. Tablica punktów obwiedni zawiera zawsze 32 pola, niezależnie od tego ile punktów jest wykorzystanych.

Materiały źródłowe

  • Instrukcja użytkownika programu DigiBooster Professional 2.21 (dołączona m.in. do wersji demo programu).
  • Kod źródłowy odtwarzacza modułów DBM (dołączony m.in. do wersji demo programu DigiBooster).

Linki zewnętrzne