Karta byłaby hardware'ową wersją SoftSyntha, nie obciążającą właściwego procesora?
O, właśnie. Proc miałby tylko obliczyć parametry i podać polecenie "play".
Nie jesteś zalogowany. Proszę się zalogować lub zarejestrować.
CAS2Audio 1.0.4 po dwóch latach Nowa wersja aplikacji do odtwarzania plików .CAS na Androidzie.
Gopher2600 0.41.0 już dostępny Nowa wersja emulatora Atari 2600 z ulepszonymi zrzutami ekranu i poprawkami ARM
ELSA 1.02 Asembler w stylu MAE, stworzony w całości na Atari
Nadchodzi Antonia 2 - nowy akcelerator Nowa karta rozszerzeń od Simiusa z 14 MHz CPU i 16 MB RAM
BigPEmu 1.19 Ulepszona emulacja i nowe funkcje w wydaniu 1.19
atari.area forum » Posty przez pik33
Karta byłaby hardware'ową wersją SoftSyntha, nie obciążającą właściwego procesora?
O, właśnie. Proc miałby tylko obliczyć parametry i podać polecenie "play".
I jeszcze jedna poprawka. Poprawka pomoże, gdyby komuś program sypał się z błędem, że np. '12.345' nie jest liczbą zmiennoprzecinkową. Ta małpa bierze nie wiadomo po co separator dziesiętny z systemu, a w Polsce to ',' a nie '.'. Poniższa poprawka powinna to załatwić, zmienna "decimalseparator' została na sztywno ustawiona na '.', poza tym poniższa wersja niczym nie różni się od poprzedniej.
Następną wersję na win wrzucę jak już będzie bardziej uporządkowana, chyba, że dostanę od was informacje, że coś sie bardzo mocno sypie.
Właśnie przepisuję tę syntezę od nowa na zmienny przecinek, będzie spokój z "range check". Wyniki pośrednie obliczeń przekraczają wartości 32-bitowego inta i dlatego się sypie. Jak się pisze na 64 bitowym systemie to takie kwiatki przechodzą niezauważone, póki się rekompilacji na 32 bitach nie zrobi.
Wczoraj, jak wstawiałem program, "Opanowanie świata" i "Wodospadem czasu" na xp32 grało, dlatego zresztą wstawiłem.
Edit: podmieńcie exeka na ten. Nie powinien już wyrzucać range check errorów.
Poszła wersja z vibem :)
Przyczyna błędu: przekroczony maxint na 32-bitowym systemie.
Dodałem obsługę vib, tyle, że narobił mi się bałagan w kodzie syntezy. W jednym miejscu jednostką jest Hz/1000, w innym Hz/1000000, jeszcze gdzie indziej Hz/65536 - jak to tak zostawię, to za chwilę to się wszystko pochrzani.
Po uprzątnięciu kodu (pewnie jutro), wstawię nową wersję. Z chodzącym vibem te kawałki zupełnie inaczej brzmią.
EDIT: dziś nie wstawię nowej wersji dla win. Piszę to pod 64-bit lin, gdzie wszystko działa dobrze, ale coś spsułem w programie tak, że po skompilowaniu dla win32 wydaje jakieś dziwne dźwięki, zamiast grać co trzeba. Muszę teraz znaleźc ten błąd, a dziś już nie będę miał kiedy.
Przy tej okazji: działa już zakładka Masic Editor; do tej pory był to tylko podgląd, teraz można rzeczywiście edytować w nim masicowy kod.
Chyba założę projekt dla tego programu na sourceforge. Będzie prościej.
@dely: może i lepiej. Zwłaszcza jakby kiedyś pojawiła się jakaś wersja instalacyjna. Póki co to wczesna alfa, przy tym pisana pod linuxem - żeby tego exeka zrobić, musiałem specjalnie "wyłazić do windy" coby program zrekompilować pod win32.
Przy czym pokazała się w całej pełni moc Lazarusa: ni jednej linijki nie zmieniłem w kodzie, tylko otworzyłem projekt pod windą i wcisnąłem F9.
@tebe: okno ma 1356 pixeli szerokości. Mieści się na tym, na czym to robię (jeden komputer ma monitor 19" @1440x900, drugi 24" 1920x1200). Jak widać, ciężko byłoby upchać to wszystko w mniejszym oknie, poza tym, o 1024x768 zapomniałem dawno temu, od czasu jak kupiłem sobie w 2001 roku 19" CRT. Skoro nie dało się to upchać na mniejszym kawałku ekranu, to przynajmniej pilnowałem, żeby weszło na HD Ready 1366x768.
Jeśli będzie dużo "skarg" że okno za duże, pomyślimy. To nie jest nawet jeszcze beta, to się wszystko może zmienić. Machinę grającą pisałem od nowa już kilka razy.
btw. "standard midi" to archaizm o ktorym lepiej zapomniec... to zwykly port szeregowy + protokol, ktory sie tu raczej nie przyda...
Tak, ale dla muzyki to jest nadal standard. Czemu protokół się nie przyda? Przecież to ma być syntezator. Ma realizować polecenia - "zagraj nutkę" - po co mam wymyślać koło po raz drugi, jak jest standard midi opracowany i chodzący?
Jedyne co trzeba dodać, a co jest "poza podstawowym midi" to upload definicji .s i .h do takiego syntha. Więc jak to się da w prosty sposób wysłać po midi, to się tego będę trzymał na początek.
Uwaga do programu - katalogi w ustawieniach podawajcie z kończącym \, np: D:\softsynth\s\. Inaczej nie zagra.
Używam na co dzień opensuse. Pewnie też jest tylko trza go z repozytorium dodać. Ale .uc2 ...
O ile standard midi pozwala na posłanie paru kilobajtów luzem, to by była najlepsza rzecz.
No to miłej zabawy. Katalog lst zawiera listingi zrzucone z atari softsyntha poleceniem list
WERSJA WYŁĄCZNIE DO TESTOWANIA !!!
Na dziś pc-softsynth interpretuje to, co mam softsynthowego do interpretacji, w miarę prawidłowo. Problemy z postu powyżej rozwiązane albo ominięte,. Z efektów mam na dziś obsługę > z jednym parametrem. Jak chcecie wersje alfa .exe na pożarcie, moge gdzieś wrzucić. Jest to alfa, więc błędy są na 100%.
Można użyć (tfu!!!) usb. Odrzuca mnie od tego - już wolę zasymulować port szeregowy na karcie dźwiękowej, to ma każdy pecet. Co do Atari, port joysticka wystarczy - swoją pracę magisterską, napisaną na 130XE, jeden rozdział naraz mieścił się w RAMie, w ten sposób wydrukowałem. @1989...
Na razie luźny pomysł więc jeśli moderatorzy uznają że to nie powinno tu być... niech przerzucą to gdzie indziej.
Otóż robię ja sobie softsyntha na PC
I doszedłem do wniosku, że machinę produkującą softsynthowy dźwięk udźwignie jakiś niedrogi mikrokontroler. A dane które trzeba do niej wysłać... to kilka KB definicji na początek a potem kilkanaście bajtów na sekundę, żeby wiedział co grać.
Można by to było podpiąć do Atari za pomocą portu joysticka (20 lat temu podpiąłem tak do 130XE drukarkę RS232)... a do PC na przykład przez stary dobry LPT.
Z tym, że jeśli w ogóle za to się wezmę, to dopiero po zakończeniu projektu pt. "PC-Softsynth"
Dwie lewe rączki bo producenci pakerów na owe systemy z graficzną powłoką zapomnieli o takich archaicznych formatach jak .arc a także .uc2 ( ktoś jeszcze pamięta .uc2?) No i jak ktoś nie zachował softu w archiwach, to ze znalezieniem czegoś co to rozpakuje, jest teraz niemała bieda. .uc2 nie rozpakuje dziś już nic, jak trzeba, to stosowny program odpalam pod dosboxem.
SAP to tak naprawdę cokolwiek okrojony program na Atari; player do SAPa to minimalna wersja emulatora. Czyli sprzętowy player SAPa to takie okrojone Atari
Ze względu na to że robię teraz softsyntha na PC, babrałem się w SAPach typu softsynth. A tam był żywy nietknięty kod softsynthowego modułu i nietknięte pliki .s i .h które wystarczyło powyciągać na zasadzie kopiuj z pliku od..do.
No i próbując odtworzyć słynny "wodospadem" nadziałem się na piękne "kwiatki"
Kwiatek 1: dźwięk a-4.... a ja zrobiłem dekodowanie od -3
Kwiatek 2:
tron... set.... wait.. set.. wait.. set... wait... troff.
No, żesz... tego się po nim nie spodziewałem; prawie jak wielowątkowość na atarynie. Leci sobie w jednym wątku track, a drugi mu "w trakcie" zmienia brzmienia... no i teraz muszę to uwzględnić.
Kwiatek #3: jazda na atarowych artefaktach z użyciem sampla "random". Na PC żeby to brzmiało z sensem, trzeba zmieniać częstotliwości tak ze 100 razy w dół, np z 500 na 5 Hz, inaczej zamiast szumu a'la perkusja dostaje się jakieś metaliczne odgłosy.
No a obsługa efektu > ... bajka. Częstotliwości są modyfikowane jakąś funkcją kwadratową a w dodatku "odbijają" się od zera i liczone są modulo 11 kHz. Będzie robota, żeby to zaimplementować.
No ale przynajmniej dziś po paru poprawkach kawałek "Wodospadem" zabrzmiał choć podobnie do tego, co być powinno, bo jeszcze dziś rano to była niezorganizowana kakofonia do niczego niepodobna.
Edit:
Im dalej w las, tym więcej drzew. Tym razem Aquanaut.
"tron" wewnątrz track. Procedura w procedurze.
Cała procedura interpretacji programu, jaką do tej pory zrobiłem, jest w rezultacie do przepisania od nowa. Jeśli mam "tron" wewnątrz definicji tracka, musi być ona rekurencyjna, a póki co nie jest (i nigdy nie myślałem, że będzie). Atari Softsynth zaskoczył ponownie możliwościami... Ciekaw jestem, ile takich kwiatków jeszcze znajdę.
Leci czyściej, bo pracuje na 16 bitach, a nie na czterech. Można zrobić opcję 4-bitowego próbkowania na 11 kHz, będzie choć trochę przypominać atari. Dokłądnego brzmienia 8-bitowca razem ze wszystkimi artefaktami nie odtworzę.
Z drugiej strony program ma służyć do robienia muzyki nie tylko na Atari ale i "w ogóle" - takich brzmień jakie ma softsynth i takiej swobody definiowania nie ma żaden inny program muzyczny jaki znam. Mając do dyspozycji 32 kanały i dobry edytor można będzie tym robić porządną muzykę syntezatorową. Silnik obsługuje (a raczej ma obsługiwać) także stereofonię i panning.
Edit: odlinkowuję "Opanowanie..." w formacie mp3 bo to już historia i nie odpowiada temu, co program może dziś zagrać.
Plik wynikowy z tego to będzie kod źródłowy Masica w formacie tekstowym, oraz pliki .s i .h, przy czym edytor brzmień jest w 90% gotowy; po uporządkowaniu tego ( w sumie - nie działa mi jeszcze zapis .h i konwersja 16bit>4 bity ) można będzie edytować .s i .h na PC po czym używać tych plików na Atari.
Kod Masica będzie bez problemu chodził pod softsynthem, pod warunkiem nie używania więcej niż 4 kanałów. Na PC można ich będzie użyć od wielkiego... w tej chwili mam maxchannel ustawiony na 32; odtwarzanie plików z atari zabiera jakieś 3% mocy procesora. W razie czego zawsze moge użyć asemblera; Lazarus pozwala na asemblerowy kod.
Napiszcie, na jakich systemach pracujecie na pc - program robię na 64-bitowym linuxie, ale dziś przetestowałem go na windows XP; kompiluje się i działa bez jakichkolwiek problemów (Lazarus rules :) -jak ktoś chce programować na PC lub Mac, polecam) - jak tylko edytor brzmień będzie chodził na 100%, wrzucę binarkę. Na Maca nie skompiluję; nie mam maca - ale win/lin 32/64 bit - nie ma problemów.
A tak to na dziś wygląda:
Program docelowo ma umożliwić edycję i granie muzyki na pc za pomocą softsynthowego engine'a, oraz graficzną edycję plików .s i .h (tworzenie brzmień)
Jeśli przy pisaniu muzyki zostaną zachowane atarowe ograniczenia (do 4 kanałów, i do nie pamiętam już ilu, 12? - plików .s i h na 1 moduł) to program ma za zadanie wypuścić z siebie listing wczytywalny i odgrywalny przez Atari Softsynth.
Nowego, atarowego silnika softsyntha póki co nie napiszę.
Apropos programu do grania "Wodospadem" na prawdziwym sprzęcie, proponuję po prostu oryginalny Atari Softsynth :). Gdzieś wewnątrz tego tematu ktoś zapodał dyskietki. Jakby co, tu są moje. Zrobione z tych, które stąd ściągnąłem, tyle że rozedytowane na sample, moduły i sam program. Plus skrakowane, listujące się wersje modułów Jakuba Husaka. Na emulatorze robię to tak, że najpierw wgrywam z d1 program. Potem ładuje do d1 dyskietkę z samplami a do d2 z modułami i play #d2:costam. Sample doczytują sie wtedy same z D1.
No, to pc-softsynth wreszcie zagrał modułek zaimportowany z Atari.
Póki co, nie udostępniam, bo kod jest jeszcze w proszku; program obsługuje tylko podstawowe polecenia Masica - gra dźwięki zdefiniowane przez .s i .h, obsługuje polecenia speed, track, tron, troff i set.
W trybie PC można pracować z 16-bitowymi definicjami, milisekundową rozdzielczością i 32 kanałami.
Moduły takie jak Opanowanie Świata czy Kraftwerk dadzą się już słuchać. (na 16 bitowej syntezie...:) ale bez efektów... :( )
Program w Masicu daje się oczywiście pisać od nowa i edytować, prawie jak na Atari oraz zapisywać na dysk.
Format binarny odpuściłem sobie póki co; Atari Softsynth potrafi wylistować program na dysk poleceniem list #d:nazwa.lst i załadować taki listing poleceniem Enter.
Poza tym jest graficzny edytor brzmień .s i .h; falę i ADSR można rysować myszą bądź edytować jako sumę harmonicznych, lub złożyć z sinusa, trójkąta, prostokąta i szumu; edytor potrafi też wygładzić i skonwertować pliki .s do formatu 16 bitów/1024 próbki. Pliki .h konwertowane są do 256 bajtów i 8-bitowych wartości. Wszystko to można zapisać z powrotem w 4-bitowej wersji dla Atari.
Żeby udostępnić pierwszą wersję alfa programu, muszę jeszcze doprowadzić to, co jest do porządku i usunąc krzaki. Niby proste to wszystko ale ilość kodu to już ponad 3000 linii.
Potem zajmę się efektami - echo, int, mod...
Na koniec pójdzie edytor graficzny modułów. Ale to dopiero jak obsługa Masica będzie zrobiona na 100%.
Piszę to w wolnych chwilach, więc nie wiem, ile czasu jeszcze to mi zajmie.
Program robię w Lazarusie, więc powinien bez jakichkolwiek problemów skompilować się pod win, lin i mac - jedynym wymaganiem jest SDL, którego używam do wypuszczania dźwięku na zewnątrz maszyny.
Jak mnie nie przywalą nadmiarem roboty, to jutro zacznę z interpreterem MASICa na PC. Mam w głowie ogólny schemat, ale trzeba go zaimplementować. No i trochę żmudnej roboty z dekodowaniem całej reszty poleceń - muszę zdekodować kilka modułków żeby wydusić z niego wszystkie polecenia wraz z argumentami. Modułki Jakuba Husaka mam już wszystkie w formacie softsyntha.
Poniżej procedury w Pascalu (FPC/Lazarus) - kod pisany dziś na szybko, więc nie musi być idealny. Trzeba zrobić w lazarusie formę z elementami: Memo, 2 buttony i 1 OpenDialog, po czym dokleić poniższe procedurki.
// (c) 2010 pik33
// licencja: GPL 2.0
procedure TForm1.Button1Click(Sender: TObject); //lister
var i,fh,il,command,offset,chl,line:integer;
bufor:array[1..5120] of byte;
koniec:boolean;
linijka, l2:string;
begin
if opendialog1.execute then
begin
fh:=fileopen(opendialog1.filename, $40);
fileread(fh,bufor,$168); //168
koniec:=false;
memo1.lines.clear;
repeat
il:=fileread(fh,bufor,4);
command:=bufor[4];
line:=bufor[1]+256*bufor[2];
if line>=32768 then
begin
line:=line-32768;
command:=command+256;
end;
if command=257 then offset:=bufor[3] else offset:=bufor[3] and $1F;
if command<>257 then chl:=(bufor[3] shr 5) else chl:=-1;
l2:='';
for i:=1 to 4 do l2:=l2+inttostr(bufor[i])+' ';
if (bufor[1]=00) and (bufor[2]=$80) and (bufor[3]=$20) and (bufor[4]=$20) then koniec:=true;
if not koniec then
begin
il:=fileread(fh,bufor,offset-4);
if il<>offset-4 then koniec:=true;
linijka:='('+l2+') ';
linijka:=linijka+'line: '+inttostr(line)+' ';
linijka:=linijka+'offset: '+inttostr(offset)+' ';
linijka:=linijka+'channel: '+inttostr(chl)+' ';
linijka:=linijka+'command: '+inttostr(command)+': ';
linijka:=linijka+'args: ';
for i:=1 to offset-4 do linijka:=linijka+inttostr(bufor[i])+' ';
memo1.lines.add(linijka);
end;
until koniec;
fileclose(fh);
end;
end;
procedure TForm1.Button2Click(Sender: TObject); //cracker
var i,fh2,fh,il,command,offset,chl,line:integer;
bufor:array[1..5120] of byte;
koniec:boolean;
linijka, l2:string;
linenum_lo,linenum_hi:byte;
begin
if opendialog1.execute then
begin
fh:=fileopen(opendialog1.filename, $40);
fh2:=filecreate(opendialog1.filename+'.crack');
fileread(fh,bufor,$168);
filewrite(fh2,bufor,$168);
linenum_lo:=0;
linenum_hi:=0;
koniec:=false;
memo1.lines.clear;
repeat
il:=fileread(fh,bufor,4);
command:=bufor[4];
line:=bufor[1]+256*bufor[2];
if (bufor[1]=00) and (bufor[2]=$80) and (bufor[3]=$20) and (bufor[4]=$20) then koniec:=true;
if line>=32768 then
begin
line:=line-32768;
command:=command+256;
end;
if command=257 then offset:=bufor[3] else offset:=bufor[3] and $1F;
if not koniec then
begin
inc(linenum_lo);
if linenum_lo=0 then inc(linenum_hi);
bufor[1]:=linenum_lo;
bufor[2]:=linenum_hi;
if command>=256 then bufor[2]:=bufor[2] or 128;
filewrite(fh2,bufor,4);
il:=fileread(fh,bufor,offset-4);
if il<>offset-4 then koniec:=true;
filewrite(fh2,bufor,il);
end;
until koniec;
bufor[1]:=0;bufor[2]:=$80;bufor[3]:=$20;bufor[4]:=$20;bufor[5]:=$20;
filewrite(fh2,bufor,5);
fileclose(fh);
fileclose(fh2);
end;
end;
PS: czy macie gdzieś tu miejsce na wrzucanie plików?
Po rozpracowaniu w jakichś 70% kodu zapisu muzyki w Softsynth jestem coraz bardziej pełen podziwu dla autora/autorów. W każdym razie mam już wstępną wersję listera na PC - autor tego softu zadbał, żeby najczęściej używane polecenie w stylu 1,C1 było zapisane jsk najoszczędniej. 5 bajtów na nutkę, z czego 2 bajty numeru linii, 1 bajt offsetu do następnego polecenia, skombinowanego z numerem kanału i zapalonym siódmym bitem (ten zapalony bit robi za kod tego polecenia, pozostałe mają kod na 4 bajcie plus 15 bit numeru linii), dwa pozostałe bajty to częstotliwość, pomnożona przez jakąś dziwaczną stałą, (65/11 - nie wiem skąd taka dziwna liczba) w każdym razie dźwięk A (440 Hz) =$0A28 = 2600 dec
A moduły zabezpieczone przed listowaniem mają najzwyczajniej w świecie wyzerowane wszystkie numery linii.
Początek kodu zaczyna się zawsze $168 bajtów od początku pliku. Wcześniej jest nagłówek i nazwy plików sampli/adsr użytych w module.
Rekord zapisu ma strukturę następującą (bajty liczę od 1):
bajt 1,2 (15 bitów) - numer linii (LO, HI); bit 7 bajtu HI jest bitem 9 kodu instrukcji
bajt 3:
- bit 7 - ustawiony na 1 oznacza 2-argumentową uproszczoną instrukcję grania tonu (kanał, ton)
- bity 6,5 - numer kanału dla niektórych instrukcji
- bity 0..4 - długośc rekordu w bajtach.
Dla polecenia "print" długością rekordu są bity 0..6
bajt 4: 8 młodszych bitów kodu instrukcji; jeśli bit 7 bajtu 3 =1 to bajt 4 i 5=częstotliwość*65/11
kolejne bajty, do końca rekordu: argumenty instrukcji.
Plik kończy się sekwencją $00,$80,$20,$20,$20
Zdekodowane jak dotąd polecenia (kody dec):
125 - pełne polecenie grania w składni kanał, ton,fala,obwiednia,głośność, czas, opóźnienie
257 - print ('?')
265 - speed
260..263 set 1..set 4
273 tron
274 troff
275 track
291 wait
Reszta kodów to już tylko kwestia czasu.. trzeba zacząć robić maszynę grającą na PC i sprawdzić, czy nie da się wyciągnąc tego samego kodu z plików .sap
--------------
EDIT: Kod źródłowy plików SoftSyntha daje się wyciągnąć z SAPa. Dają się też z niego wyciągnąć wszystkie użyte w module .s i .h. Właśnie wydusiłem "Wodospadem czasu" (nie miałem tego źródła) oraz brakujący w moich zasobach "beben.s", wrzuciłęm z pomocą windows commandera do obrazu dyskietki .atr, uruchomiłem pod emulatorem softsyntha - plik wczytuje się i gra.
atari.area forum » Posty przez pik33
Wygenerowano w 0.020 sekund, wykonano 52 zapytań