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).
 
