SS (format pliku)
From Atariki
Wersja z dnia 13:34, 23 lip 2015 Mono (Dyskusja | wkład) (format pliku modulu softsyntha) ← Previous diff |
Aktualna wersja Mono (Dyskusja | wkład) (→Długa postać linii - fala+obwiednia) |
||
Linia 1: | Linia 1: | ||
{{SDP}} | {{SDP}} | ||
- | Format modułu programu [[Softsynth]]. | + | Format modułu muzycznego programu [[Softsynth]]. |
- | Plik składa się ze stałego nagłówka i stokenizowanego kodu programu w języku MASIC. | + | Plik składa się ze stałego nagłówka i stokenizowanego kodu programu w języku MASIC o zmiennej długości. |
Wszystkie słowa zapisane są w kolejności LSB, MSB. | Wszystkie słowa zapisane są w kolejności LSB, MSB. | ||
Linia 33: | Linia 33: | ||
Kod programu znajduje się w pliku w postaci stokenizowanej i jest zapisany linia po linii. | Kod programu znajduje się w pliku w postaci stokenizowanej i jest zapisany linia po linii. | ||
- | + | ||
== Format linii == | == Format linii == | ||
Linia 39: | Linia 39: | ||
<tr><td>offset</td><td>długość</td><td>opis</td></tr> | <tr><td>offset</td><td>długość</td><td>opis</td></tr> | ||
<tr><td>$0000</td><td>$0002</td><td>numer linii</td></tr> | <tr><td>$0000</td><td>$0002</td><td>numer linii</td></tr> | ||
- | <tr><td>$0002</td><td>$0001</td><td>długość całej linii</td></tr> | + | <tr><td>$0002</td><td>$0001</td><td>długość linii</td></tr> |
<tr><td>$0003</td><td>...</td><td>dane</td></tr> | <tr><td>$0003</td><td>...</td><td>dane</td></tr> | ||
</table> | </table> | ||
+ | |||
+ | Linie mogą przyjmować numery w zakresie 1..32767 w związku z czym słowo numeru linii dzieli się na dwie części: | ||
+ | |||
+ | * bity 0..14: numer linii | ||
+ | * bit 15: znacznik rodzaju linii (0=linia nuty, 1=linia rozkazu sterującego) | ||
+ | |||
+ | Długość linii liczona jest, analogicznie jak w BASIC-u, łącznie z bajtami numeru linii i długości. | ||
=== Linia nuty === | === Linia nuty === | ||
Linia 56: | Linia 63: | ||
Występuje tu tylko słowo częstotliwości nuty. | Występuje tu tylko słowo częstotliwości nuty. | ||
+ | |||
+ | Przykładowa krótka linia widziana w edytorze SoftSynth: | ||
+ | |||
+ | 10 1,C | ||
==== Długa postać linii ==== | ==== Długa postać linii ==== | ||
Linia 70: | Linia 81: | ||
* bit 5: czas trwania | * bit 5: czas trwania | ||
* bit 6: MSB czasu oczekiwania | * bit 6: MSB czasu oczekiwania | ||
- | * bit 7: dodatkowy efekt | + | * bit 7: dodatkowe efekty |
2. Słowo częstotliwości nuty. | 2. Słowo częstotliwości nuty. | ||
Linia 82: | Linia 93: | ||
* bajt LSB czasu oczekiwania, | * bajt LSB czasu oczekiwania, | ||
* bajt MSB czasu oczekiwania, | * bajt MSB czasu oczekiwania, | ||
- | * bajt znaczników dodatkowych efektów: | + | * bajt znaczników dodatkowych efektów. |
Znaczniki dodatkowych efektów: | Znaczniki dodatkowych efektów: | ||
Linia 98: | Linia 109: | ||
* bajt głębokości glissanda (0-9), | * bajt głębokości glissanda (0-9), | ||
* słowo czasu przejścia glissanda. | * słowo czasu przejścia glissanda. | ||
+ | |||
+ | Czas przejścia glissanda (jakkolwiek w kodzie programu zapisywany) jest przez procedurę odtwarzającą ignorowany. | ||
+ | |||
+ | Przykładowa długa linia widziana w edytorze SoftSynth: | ||
+ | |||
+ | 10 1,C,SINUS,DEFAULT,15,100,100,<,>C1,1,100 | ||
=== Linia rozkazu sterującego === | === Linia rozkazu sterującego === | ||
Linia 108: | Linia 125: | ||
* bajt $01 | * bajt $01 | ||
- | * bajt czasu wyświetlania tekstu mierzony w 1/50 sekundy | + | * bajt czasu wyświetlania tekstu mierzonego w 1/50 sekundy |
* tekst do wyświetlenia zapisany w ATASCII | * tekst do wyświetlenia zapisany w ATASCII | ||
Linia 128: | Linia 145: | ||
* bajt głośności | * bajt głośności | ||
* słowo czasu trwania | * słowo czasu trwania | ||
- | * słowo czasu oczekiwania | + | * słowo czasu oczekiwania liczonego w tiknięciach licznika tempa |
5. <b>SET 2,fala,obwiednia,głośność,czas trwania,czas oczekiwania</b> | 5. <b>SET 2,fala,obwiednia,głośność,czas trwania,czas oczekiwania</b> | ||
Linia 137: | Linia 154: | ||
* bajt głośności | * bajt głośności | ||
* słowo czasu trwania | * słowo czasu trwania | ||
- | * słowo czasu oczekiwania | + | * słowo czasu oczekiwania liczonego w tiknięciach licznika tempa |
6. <b>SET 3,fala,obwiednia,głośność,czas trwania,czas oczekiwania</b> | 6. <b>SET 3,fala,obwiednia,głośność,czas trwania,czas oczekiwania</b> | ||
Linia 146: | Linia 163: | ||
* bajt głośności | * bajt głośności | ||
* słowo czasu trwania | * słowo czasu trwania | ||
- | * słowo czasu oczekiwania | + | * słowo czasu oczekiwania liczonego w tiknięciach licznika tempa |
7. <b>SET 4,fala,obwiednia,głośność,czas trwania,czas oczekiwania</b> | 7. <b>SET 4,fala,obwiednia,głośność,czas trwania,czas oczekiwania</b> | ||
Linia 155: | Linia 172: | ||
* bajt głośności | * bajt głośności | ||
* słowo czasu trwania | * słowo czasu trwania | ||
- | * słowo czasu oczekiwania | + | * słowo czasu oczekiwania liczonego w tiknięciach licznika tempa |
8. <b>MOD modulacja</b> | 8. <b>MOD modulacja</b> | ||
* bajt $08 | * bajt $08 | ||
- | * bajt typu modulacji | + | * bajt typu modulacji (0..4) |
9. <b>SPEED tempo</b> | 9. <b>SPEED tempo</b> | ||
Linia 183: | Linia 200: | ||
* bajt $11 | * bajt $11 | ||
- | * bajt numeru ścieżki | + | * bajt numeru ścieżki ($00..$1F) |
13. <b>TROFF numer ścieżki</b> | 13. <b>TROFF numer ścieżki</b> | ||
* bajt $12 | * bajt $12 | ||
- | * bajt numeru ścieżki | + | * bajt numeru ścieżki ($00..$1F) |
14. <b>TRACK numer ścieżki</b> | 14. <b>TRACK numer ścieżki</b> | ||
* bajt $13 | * bajt $13 | ||
- | * bajt numeru ścieżki | + | * bajt numeru ścieżki ($00..$1F) |
15. <b><i>koniec utworu</i></b> | 15. <b><i>koniec utworu</i></b> | ||
Linia 230: | Linia 247: | ||
* bajt $43 | * bajt $43 | ||
- | 21. <b>OFF 1</b> | + | 22. <b>OFF 1</b> |
* bajt $80 | * bajt $80 | ||
- | 22. <b>OFF 2</b> | + | 23. <b>OFF 2</b> |
* bajt $81 | * bajt $81 | ||
- | 23. <b>OFF 3</b> | + | 24. <b>OFF 3</b> |
* bajt $82 | * bajt $82 | ||
- | 24. <b>OFF 4</b> | + | 25. <b>OFF 4</b> |
* bajt $83 | * bajt $83 | ||
- | 25. <b>PHAS fala,obwiednia,okres</b> | + | 26. <b>PHAS fala,obwiednia,okres</b> |
* bajt $C0 | * bajt $C0 | ||
Linia 253: | Linia 270: | ||
* słowo okresu | * słowo okresu | ||
- | 26. <b>VIB 1,fala,obwiednia,głębokość,okres,okres</b> | + | 27. <b>VIB 1,fala,obwiednia,głębokość,okres,okres</b> |
* bajt $E0 | * bajt $E0 | ||
* bajt indeksu fali | * bajt indeksu fali | ||
* bajt indeksu obwiedni | * bajt indeksu obwiedni | ||
- | * bajt głębokości | + | * bajt głębokości (0..9) |
* słowo okresu | * słowo okresu | ||
* słowo okresu | * słowo okresu | ||
- | 27. <b>VIB 2,fala,obwiednia,głębokość,okres,okres</b> | + | 28. <b>VIB 2,fala,obwiednia,głębokość,okres,okres</b> |
* bajt $E1 | * bajt $E1 | ||
* bajt indeksu fali | * bajt indeksu fali | ||
* bajt indeksu obwiedni | * bajt indeksu obwiedni | ||
- | * bajt głębokości | + | * bajt głębokości (0..9) |
* słowo okresu | * słowo okresu | ||
* słowo okresu | * słowo okresu | ||
- | 28. <b>VIB 3,fala,obwiednia,głębokość,okres,okres</b> | + | 29. <b>VIB 3,fala,obwiednia,głębokość,okres,okres</b> |
* bajt $E2 | * bajt $E2 | ||
* bajt indeksu fali | * bajt indeksu fali | ||
* bajt indeksu obwiedni | * bajt indeksu obwiedni | ||
- | * bajt głębokości | + | * bajt głębokości (0..9) |
* słowo okresu | * słowo okresu | ||
* słowo okresu | * słowo okresu | ||
- | 29. <b>VIB 4,fala,obwiednia,głębokość,okres,okres</b> | + | 30. <b>VIB 4,fala,obwiednia,głębokość,okres,okres</b> |
* bajt $E3 | * bajt $E3 | ||
* bajt indeksu fali | * bajt indeksu fali | ||
* bajt indeksu obwiedni | * bajt indeksu obwiedni | ||
- | * bajt głębokości | + | * bajt głębokości (0..9) |
* słowo okresu | * słowo okresu | ||
* słowo okresu | * słowo okresu | ||
- | 30. <b>VIB 1,fala,głębokość,okres</b> | + | 31. <b>VIB 1,fala,głębokość,okres</b> |
* bajt $E8 | * bajt $E8 | ||
* bajt indeksu fali | * bajt indeksu fali | ||
- | * bajt głębokości | + | * bajt głębokości (0..9) |
* słowo okresu | * słowo okresu | ||
- | 31. <b>VIB 2,fala,głębokość,okres</b> | + | 32. <b>VIB 2,fala,głębokość,okres</b> |
* bajt $E9 | * bajt $E9 | ||
Linia 303: | Linia 320: | ||
* słowo okresu | * słowo okresu | ||
- | 32. <b>VIB 3,fala,głębokość,okres</b> | + | 33. <b>VIB 3,fala,głębokość,okres</b> |
* bajt $EA | * bajt $EA | ||
* bajt indeksu fali | * bajt indeksu fali | ||
- | * bajt głębokości | + | * bajt głębokości (0..9) |
* słowo okresu | * słowo okresu | ||
- | 33. <b>VIB 4,fala,głębokość,okres</b> | + | 34. <b>VIB 4,fala,głębokość,okres</b> |
* bajt $EB | * bajt $EB | ||
* bajt indeksu fali | * bajt indeksu fali | ||
- | * bajt głębokości | + | * bajt głębokości (0..9) |
* słowo okresu | * słowo okresu | ||
- | 34. <b>VIB 1 OFF</b> | + | 35. <b>VIB 1 OFF</b> |
* bajt $F0 | * bajt $F0 | ||
- | 35. <b>VIB 2 OFF</b> | + | 36. <b>VIB 2 OFF</b> |
* bajt $F1 | * bajt $F1 | ||
- | 36. <b>VIB 3 OFF</b> | + | 37. <b>VIB 3 OFF</b> |
* bajt $F2 | * bajt $F2 | ||
- | 37. <b>VIB 4 OFF</b> | + | 38. <b>VIB 4 OFF</b> |
* bajt $F3 | * bajt $F3 | ||
Linia 351: | Linia 368: | ||
= Ciekawostki = | = Ciekawostki = | ||
- | * Zabezpieczenie plików przed odczytem w edytorze SoftSynth polega na nadaniu wszystkim liniom wartości 0. | + | * Zabezpieczenie plików przed listowaniem w edytorze SoftSynth polega na nadaniu wszystkim liniom wartości 0. |
* Faktyczna częstotliwość odtwarzania playera wynosi 10983 Hz. | * Faktyczna częstotliwość odtwarzania playera wynosi 10983 Hz. | ||
* Rozszerzenie pliku zostało zaproponowane przez [[Mono]], ponieważ oryginalne pliki modułów go nie miały (sporadycznie spotykano .MUS lub .SYN). | * Rozszerzenie pliku zostało zaproponowane przez [[Mono]], ponieważ oryginalne pliki modułów go nie miały (sporadycznie spotykano .MUS lub .SYN). |
Aktualna wersja
Format modułu muzycznego programu Softsynth.
Plik składa się ze stałego nagłówka i stokenizowanego kodu programu w języku MASIC o zmiennej długości.
Wszystkie słowa zapisane są w kolejności LSB, MSB.
Spis treści |
Nagłówek
offset | długość | opis |
$0000 | $0004 | identyfikator: 'SYN',$9B w ASCII |
$0004 | $0002 | ilość wierszy programu |
$0006 | $0002 | długość bloku programu - 1 |
$0008 | $00B0 | blok 16 definicji plików fal .S |
$00B8 | $00B0 | blok 16 definicji plików obwiedni .H |
$0168 | ... | stokenizowany kod programu |
Definicja pliku fali/obwiedni
offset | długość | opis |
$0000 | $0001 | długość nazwy - 1 |
$0001 | $0002 | ile razy nazwa fali/obwiedni została użyta w programie |
$0003 | $0008 | nazwa |
Nazwa to nazwa pliku lecz bez dołączonego rozszerzenia.
Program w MASIC-u
Kod programu znajduje się w pliku w postaci stokenizowanej i jest zapisany linia po linii.
Format linii
offset | długość | opis |
$0000 | $0002 | numer linii |
$0002 | $0001 | długość linii |
$0003 | ... | dane |
Linie mogą przyjmować numery w zakresie 1..32767 w związku z czym słowo numeru linii dzieli się na dwie części:
- bity 0..14: numer linii
- bit 15: znacznik rodzaju linii (0=linia nuty, 1=linia rozkazu sterującego)
Długość linii liczona jest, analogicznie jak w BASIC-u, łącznie z bajtami numeru linii i długości.
Linia nuty
Jeśli najstarszy bit numeru linii jest skasowany wtedy oznacza to, że w linii zdefinowana jest nuta przeznaczona do odegrania.
Bajt długości linii dzielony jest wtedy na 3 części i zawiera:
- bity 0..4: długość linii
- bity 5..6: numer kanału na którym będzie uruchomiony dźwięk
- bit 7: 0-długa postać linii, 1-krótka postać linii
Krótka postać linii
Występuje tu tylko słowo częstotliwości nuty.
Przykładowa krótka linia widziana w edytorze SoftSynth:
10 1,C
Długa postać linii
Kolejne bajty określają:
1. Bajt znaczników określających jakie dane zapisane są dalej (0-znacznik skasowany, 1-znacznik ustawiony):
- bit 0: LSB czasu oczekiwania
- bit 1: niewykorzystany
- bit 2: fala
- bit 3: obwiednia
- bit 4: głośność
- bit 5: czas trwania
- bit 6: MSB czasu oczekiwania
- bit 7: dodatkowe efekty
2. Słowo częstotliwości nuty.
3. Występowanie kolejnych bajtów zależy od stanu znaczników:
- bajt indeksu fali,
- bajt indeksu obwiedni,
- bajt głośności (0..15),
- słowo czasu trwania dźwięku,
- bajt LSB czasu oczekiwania,
- bajt MSB czasu oczekiwania,
- bajt znaczników dodatkowych efektów.
Znaczniki dodatkowych efektów:
- bity 0..1: niewykorzystane
- bit 2: glissando
- bit 3: wartość glissanda jest ujemna
- bit 4: wartość glissanda jest podzielona przez 256
- bit 5: dźwięk ciągły
- bity 6..7: niewykorzystane
W przypadku gdy znacznik glissanda (bit 2) jest ustawiony wtedy dalej następują bajty opisujące efekt:
- słowo przyrostu dla nuty docelowej glissanda,
- bajt głębokości glissanda (0-9),
- słowo czasu przejścia glissanda.
Czas przejścia glissanda (jakkolwiek w kodzie programu zapisywany) jest przez procedurę odtwarzającą ignorowany.
Przykładowa długa linia widziana w edytorze SoftSynth:
10 1,C,SINUS,DEFAULT,15,100,100,<,>C1,1,100
Linia rozkazu sterującego
Jeśli najstarszy bit numeru linii jest ustawiony wtedy oznacza to, że w linii znajduje się token rozkazu sterującego wraz z bajtami danych rozkazu.
Tokeny
1. ? czas : tekst
- bajt $01
- bajt czasu wyświetlania tekstu mierzonego w 1/50 sekundy
- tekst do wyświetlenia zapisany w ATASCII
2. / polecenia
- bajt $02
- tekst poleceń edytora zapisany w ATASCII
3. ; komentarz
- bajt $03
- tekst komentarza zapisany w ATASCII
4. SET 1,fala,obwiednia,głośność,czas trwania,czas oczekiwania
- bajt $04
- bajt indeksu fali
- bajt indeksu obwiedni
- bajt głośności
- słowo czasu trwania
- słowo czasu oczekiwania liczonego w tiknięciach licznika tempa
5. SET 2,fala,obwiednia,głośność,czas trwania,czas oczekiwania
- bajt $05
- bajt indeksu fali
- bajt indeksu obwiedni
- bajt głośności
- słowo czasu trwania
- słowo czasu oczekiwania liczonego w tiknięciach licznika tempa
6. SET 3,fala,obwiednia,głośność,czas trwania,czas oczekiwania
- bajt $06
- bajt indeksu fali
- bajt indeksu obwiedni
- bajt głośności
- słowo czasu trwania
- słowo czasu oczekiwania liczonego w tiknięciach licznika tempa
7. SET 4,fala,obwiednia,głośność,czas trwania,czas oczekiwania
- bajt $07
- bajt indeksu fali
- bajt indeksu obwiedni
- bajt głośności
- słowo czasu trwania
- słowo czasu oczekiwania liczonego w tiknięciach licznika tempa
8. MOD modulacja
- bajt $08
- bajt typu modulacji (0..4)
9. SPEED tempo
- bajt $09
- bajt tempa mierzonego w 1/200 sekundy
10. INT kanał,kanał,różnica
- bajt $0A
- bajt numeru kanału - 1
- bajt numeru kanału - 1
- bajt różnicy częstotliwości
11. KW czas,czas
- bajt $10
- bajt czasu mierzonego w tiknięciach licznika tempa
- bajt czasu mierzonego w tiknięciach licznika tempa
12. TRON numer ścieżki
- bajt $11
- bajt numeru ścieżki ($00..$1F)
13. TROFF numer ścieżki
- bajt $12
- bajt numeru ścieżki ($00..$1F)
14. TRACK numer ścieżki
- bajt $13
- bajt numeru ścieżki ($00..$1F)
15. koniec utworu
- bajt $20
- bajt $20
Rozkaz końca utworu ma zawsze numer linii ustawiony na $8000 i bajt długości linii na $20 (co nie pokrywa się z prawdą, ponieważ ma ona zawsze rzeczywistą długość 5 bajtów - ma to zresztą odzwierciedlenie w słowie długości programu MASIC-a w nagłówku pliku).
16. PHAS OFF
- bajt $21
17. WAIT czas
- bajt $23
- słowo czasu oczekiwania podanego w tiknięciach licznika tempa
18. KW OFF
- bajt $40
19. ECHO kanał,kanał,opóźnienie
- bajt $41
- bajt numeru kanału - 1
- bajt numeru kanału - 1
- bajt opóźnienia liczonego w tiknięciach licznika tempa
20. ECHO OFF
- bajt $42
21. END
- bajt $43
22. OFF 1
- bajt $80
23. OFF 2
- bajt $81
24. OFF 3
- bajt $82
25. OFF 4
- bajt $83
26. PHAS fala,obwiednia,okres
- bajt $C0
- bajt indeksu fali
- bajt indeksu obwiedni
- słowo okresu
27. VIB 1,fala,obwiednia,głębokość,okres,okres
- bajt $E0
- bajt indeksu fali
- bajt indeksu obwiedni
- bajt głębokości (0..9)
- słowo okresu
- słowo okresu
28. VIB 2,fala,obwiednia,głębokość,okres,okres
- bajt $E1
- bajt indeksu fali
- bajt indeksu obwiedni
- bajt głębokości (0..9)
- słowo okresu
- słowo okresu
29. VIB 3,fala,obwiednia,głębokość,okres,okres
- bajt $E2
- bajt indeksu fali
- bajt indeksu obwiedni
- bajt głębokości (0..9)
- słowo okresu
- słowo okresu
30. VIB 4,fala,obwiednia,głębokość,okres,okres
- bajt $E3
- bajt indeksu fali
- bajt indeksu obwiedni
- bajt głębokości (0..9)
- słowo okresu
- słowo okresu
31. VIB 1,fala,głębokość,okres
- bajt $E8
- bajt indeksu fali
- bajt głębokości (0..9)
- słowo okresu
32. VIB 2,fala,głębokość,okres
- bajt $E9
- bajt indeksu fali
- bajt głębokości
- słowo okresu
33. VIB 3,fala,głębokość,okres
- bajt $EA
- bajt indeksu fali
- bajt głębokości (0..9)
- słowo okresu
34. VIB 4,fala,głębokość,okres
- bajt $EB
- bajt indeksu fali
- bajt głębokości (0..9)
- słowo okresu
35. VIB 1 OFF
- bajt $F0
36. VIB 2 OFF
- bajt $F1
37. VIB 3 OFF
- bajt $F2
38. VIB 4 OFF
- bajt $F3
Częstotliwości
Nuty podawane są w postaci częstotliwości podzielonej przez zakładaną częstotliwość odtwarzania równą 11059.2 Hz.
Nuta C w oktawie podstawowej ma częstotliwość 261 Hz.
Czas trwania
Czas trwania dźwięku podawany jest wg wzoru
16384 value = ------- czas
Czas podany jest w tiknięciach licznika tempa.
Ciekawostki
- Zabezpieczenie plików przed listowaniem w edytorze SoftSynth polega na nadaniu wszystkim liniom wartości 0.
- Faktyczna częstotliwość odtwarzania playera wynosi 10983 Hz.
- Rozszerzenie pliku zostało zaproponowane przez Mono, ponieważ oryginalne pliki modułów go nie miały (sporadycznie spotykano .MUS lub .SYN).