SS (format pliku)
From Atariki
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).