Datum: 11.04.2007 12:05
Hallo alle zusammen, durch den Thread ( Beitrag "6502 Emulation auf AVR ?" ) hier im Forum bin ich auf die Idee gekommen, eine Art Soundgenerator auf dem ATMEGA8 zu programmieren. Das Programm kann folgendes: - 3 Tongeneratoren mit Sägezahn, Rechteck mit variablem Tasverhätnis, Dreieck, Rauschen mit programmierbarer Frequenzen - 3 Einhüllendengeneratoren mit variablem Attack, Decay, Sustain, Release - Ringmodulation Der Soundgenerator versucht den SID des historischen C64 zu emulieren, die Register sind kompatibel. Eigene Musikstücke können in der Datei sound.c angehängt werden. Die Files zum Projekt finden sich hier: http://www.roboterclub-freiburg.de/atmega_sound/at... Um den Soundgenerator auszuprobieren, brauch man blos einen Atmega8 mit 16MHz Quartz. Den PWM-Ausgang kann man direkt an einen Verstärkereingang anschließen. Ich habe hierzu meine Computerboxen verwendet. Gruss, Christoph
Datum: 11.04.2007 12:26
Einen kleinen Tiefpass sollte man schon noch spendieren, nicht dass einem noch die Hochtöner von der Hifi-Anlage abrauchen ;-)
Datum: 11.04.2007 15:35
Hi Christoph, ist ja echt super was im Moment abgeht. Ich interessiere mich neuerdings auch für das Thema Sounderzeugung. (auch auf Grund des 6502Emu-Threads) Ich werd mir dein Prog mal bei Gelegenheit anschauen. Vielleicht kann ich damit ja meinen defekten SID ersetzen ;) Ich hoffe,daß die im 6502-Thread es hinbekommen einen SID-Player nur mit AVRs zu basteln... lange kann es ja nicht mehr dauern. Schade, daß ich nicht genug Wissen hab um etwas beizutragen, der C64 hat mich schon seit Ewigkeiten fasziniert und ich höre heute noch regelmässig SIDs. Gruß, SIGINT
Datum: 11.04.2007 16:21
Hallo SIGINT, es freut mich, dass es so viele Leute gibt, die sich für dieses Thema interessiern. Meine Hoffnung ist ja ein wenig, dass einige vielleicht mal ein kleines Musikstück direkt für das SID-Emulator Programm schreiben. Man kann das relativ einfach tun. In der sound.c habe ich ein paar Noten für die Soundgeneratoren per #define definiert ( gut, ich war etwas faul und habe nicht alle Noten aus dem SID-Datenblatt abgetippt ). In der aktuellen sound.c wird einfach mal eine Tonleiter abgespielt, ein Dreiklang erzeugt, die PWM mal durchfahren, die Ringmodulation getestet und Schußgeräusche mit dem Zufallsgenerator erzeugt. Die Beispiele sind glaube ich relativ einfach gehalten, so dass jeder seine eigene Melodie oder verschiedene Geräusche erzeugen kann, ohne dass er sich mit der eigentlichen Emulatorsoftware auseinandersetzen muss. Ich habe gesehen, dass es für den orginal-SID Wettbewerbe gibt, wer die schönste Sound-Kollage mit am wenigsten Speicher erzeugen kann. Vielleicht ist es für den ein oder anderen eine Herausforderung, eine schöne Klangfolge oder eine Melodie in einen Atmega8 ohne Zusatzbeschaltung hineinzuquetschen. In der aktuellen Version sind noch 40% Flash frei, da kriegt man schon noch einige Noten unter. Ich wolle schon versuchen, ein paar Melodien aus irgendwelchen MIDI-Files herauszuziehen, aber ich habe leider keine MIDI-Files gefunden und als ich ein wenig über das Format gelesen haben, erschien es mir zu kompliziert. Eigentlich bräuchte man nur die Tonhöhe und die Tondauer und wenn's schön klingen soll noch den Anschlag und den Ausklang. Das könnte man einfach in den Emulator übertragen. Gruss, Christoph
Datum: 11.04.2007 16:54
abo <--- habs ganz vergessen @Chistoph: Na optimal wäre es natürlich, wenn man direkt SIDs oder MIDIs abspielen könnte, dann muss man nicht viel an den Liedern "rumstricken". Leider ist dafür die Firmware des ATmegas dann viel aufwändiger. Aber ich bin sehr optimistisch, daß dieses Forum bald einen standalone SID-Player hervorbringt. Ich hoffe bis dann etwas verstehen zu können, wie der Emulator und die Tonerzeugung funktionieren. Ich hab überigens dein Programm mal kurz mit nem 8Mhz Quarz getestet. (hatte keinen anderen zur Hand) Ich bin mir nicht sicher was ich da genau gehört habe, aber ich vermute es war ok... nur die Tonhöhe passte natürlich nicht. Gruß, SIGINT
Datum: 11.04.2007 18:37
Kann man da auch einen piezo zum testen anhängen oder taugt das nicht?
Datum: 11.04.2007 19:34
Hallo, @Sigint 112: was hat Dein SID im 64er? Nicht nur die Sicherung durch auf dem Board? Dann geht beim alten Board (mit 6581) der Sound und der Datasettenmotor nicht. Zur Not könnte ich Dir einen SID zukommen lassen, welchen brauchst Du? Gruß aus Berlin Michael
Datum: 11.04.2007 20:03
@all mal eben eine generelle frage zu den atmegas. ich denke für einen tiefpass/hochpass/bandpass braucht man ja irgendetwas biquad-ähnliches. hat der atmega eigentlich einen hardware-multiplizierer ? wenn ja dann dürfte auch tiefpass (und sonstige pässe) kein größeres thema sein. ich bin zwar nicht firm was die atmegas angeht, doch habe ich mal auf einem msp430 einen tiefpass gebastelt (asm) und habe dort auch den hw-multiplizierer genutzt. wenn man einen solchen multipl. hat (bzw. hw-mac) gestaltet sich das rechnen eines pass-filters recht einfach (ich habe mit 16 bit audio und 16 bit koeffizienten gerechnet, beim atmega dürfte 8 bit audio und 16 bit koeffzienten reichen). das berechnen der koeffizienten ist dann eigentlich das hauptproblem (da man hier meist mit float arbeiten muß, es sein denn man ist richtig fit in mathe). man kann es sich aber auch einfach machen und vorgekaute koeffizienten in ein datenflash ablegen. nur mal so als anregung. gruß rene
Datum: 11.04.2007 20:18
Hallo, hier ist noch ein potentieller Synthesizer-Bauer ;-). Mir hat auch o.g. Thema als Anregung recht gut gefallen. Allerdings habe ich nicht vor, einen C64 SID zu emulieren, sondern einen fluffigen Live-Synth zu bauen, einen Mega128 mit der Sounderzeugung zu betrauen und einen externen D/A- Wandler (CS4334) zu verwenden. Was mir noch fehlt, ist ebenfalls ein nötiger Denkanstoß in Sachen digitale Filter. Die Kiste soll dann mal mit reichlich Knöpfen ausgestattet werden und MIDI-fähig sein. Die Ergebnisse werde ich dann in einem Extra-Thema behandeln. Wer sich mit einbringen mag, gerade was komplexe Berechnungen angeht, ist herzlich willkommen ;-). Ach, bevor ich´s vergesse: ASM ist Trumpf! Schöne Grüße, TravelRec.
Datum: 11.04.2007 20:40
@travelrec mal eine frage zu deinem live-synth. welche samplerate willst du verwenden ? bei höheren sampleraten wird das filtern insofern schwieriger (unter der verwendung von iir filtern) da du dann recht große (bit-breite) koeffizienten brauchst damit du relativ weit runterfiltern kannst (44khz und einen filter der nur bis 1 khz runterfiltern kann bringts nicht :-)) (ich benutze in meinem audio-projekt, was hier als artikel existiert, 32 bit, habe da aber auch etwas reserve). wenn deine samplerate über sagen wir mal 8kHz nicht großartig hinausgeht (oder du nicht so weit runterfiltern willst) dürften 16 bit koeffizienten reichen. (daher die frage welche atmegas einen hw-multiplier bzw. hw.mac) haben. es mag sicherlich noch andere wege für filterberechnung geben, aber ich denke biquads (also iir filter) sind am einfachsten zu implementieren (fir filter brauchen viele multiplikationen pro sample). man braucht nur ne schnelle multiplikation, und davon 5. aber andere syntheseformen wären für einen atmega sicherlich auch interessant. z.b. fm, pd, wavetablesm, additive ... nur mal so als anregung :-))
Datum: 11.04.2007 22:54
zu den Filtern: von Atmel gibt es eine Application Note zu dem Thema. Ein 2 poliger IIR-Filter braucht pro Sample ca. 120 Taktzyklen auf einem ATMEGA8, was bei F_CPU=16e6 7.5uS/Sample sind. Die ATMETGAs beinhalten einen 8x8=16Bit Multiplierer mit 2 Taktzklen Ausführungszeit, die bei den Filtern ausgiebig verwendet werden. Der Filter passt locker in den SID-Emulator, der in C ganz ohne Assembler geschrieben ist. Es war mir allerdings wichtig, die Version 1.0 möglichst schnell zu implementieren. Christoph
Datum: 11.04.2007 23:05
@SIGINT >Ich hab überigens dein Programm mal kurz mit nem 8Mhz Quarz getestet. >(hatte keinen anderen zur Hand) Ich bin mir nicht sicher was ich da >genau gehört habe, aber ich vermute es war ok... nur die Tonhöhe passte >natürlich nicht. Hast Du PIN11 mit PIN17 verbunden? Bestimmt, sonst hätte gar kein Ton kommen dürfen. Bei 8MHz läuft das ganze System auf halber Geschwindigkeit und die PWM geht auf 16Khz, da könnten für empfindliche Ohren unangenehme Hochfrequenztöne überlagert sein. @Michael >Kann man da auch einen piezo zum testen anhängen oder taugt das nicht? Du kannst auch einen Piezo benutzen, die flachen Uhrenpiezos haben aber meistens einen sehr üblen Frequenzgang, nämlich 2 ziemlich starke Resonanzfrequenzen. D.h. man wird diese Freqenzstellen laut vernehmen und Tieftöne kann man vergessen. Die Rauschgeneratoren kann man mit einem Piezo gut hören. Gruss, stochri
Datum: 12.04.2007 06:57
>mal eine frage zu deinem live-synth. welche samplerate willst du >verwenden ? Für den Anfang werde ich 32kHz Samplerate anstreben und mich damit einarbeiten. Nach entsprechenden Optimierungen und wenn alles Gewünschte auch läuft, kann man höher gehen. Die ersten Tests kann ich am Wochenende machen, wenn die Bauelemente da sind. >es mag sicherlich noch andere wege für filterberechnung geben, aber ich >denke biquads (also iir filter) sind am einfachsten zu implementieren >(fir filter brauchen viele multiplikationen pro sample). man braucht nur >ne schnelle multiplikation, und davon 5. Erzähl mal mehr! Hast Du Algorithmen oder Berechnungsgrundlagen da? >aber andere syntheseformen wären für einen atmega sicherlich auch >interessant. z.b. fm, pd, wavetablesm, additive ... Jaa, lecker! Mal sehen, was geht ;-) Muß dann aber noch etwas recherchieren. >von Atmel gibt es eine Application Note zu dem Thema. Ein 2 poliger >IIR-Filter braucht pro Sample ca. 120 Taktzyklen auf einem ATMEGA8, was >bei F_CPU=16e6 7.5uS/Sample sind. Ahh, okay - ich guck´ da mal ´rein. Danke! Schöne Grüße, TravelRec.
Datum: 12.04.2007 07:16
Die Appnote ist sehr hilfreich, auch wenn ich sie noch nicht ganz verstanden habe. Da ich mich noch nie mit derart komplexen Rechnereien auf dem AVR befaßt habe, muß ich wohl nochmal auf die Schulbank. Schöne Grüße, TravelRec.
Datum: 12.04.2007 09:15
@Michael U.: Tja, mein SID ist wahrscheinlich durch ESD gestorben... ich hab mal kurz nicht aufgepasst und vergessen den Verstärker auszuschalten. Nach einem lauten "Fump" hat der SID dann nichts mehr gesagt. :-( Danke für das Angebot für den austausch SID, aber ich hab zum Glück noch zwei C64er hier... setz den SID lieber für was sinnvolles ein. @Christoph: Ich hab noch nen analogen Tiefpass an den Ausgang gehangen... hat die PWM-Frequenz relativ gut unterdrückt. Ich werde bei Gelegenheit mal die sound.c ändern. Gruß, SIGINT
Datum: 12.04.2007 11:23
> Ich hab noch nen analogen Tiefpass an den Ausgang gehangen... hat die > PWM-Frequenz relativ gut unterdrückt. Ich werde bei Gelegenheit mal die > sound.c ändern. Gute Idee. Vielleicht findest Du ja auch eine kleine Melodie, die man eintippen kann. Der technische Teil funktioniert ja einigermaßen, jetzt sind die Künstler gefragt. Gruss, Christoph
Datum: 12.04.2007 15:34
@travelrec also alle algorithmen die ich verwendet habe stehen im dsp-buch "Digitale Signalverarbeitung" von Udo Zölzer drin. Da bekommt man auch die Formeln zur berechnung von filterkoeffizienten her. Man muß nur schauen was man an der berechnung noch optimieren kann, da man wahrscheinlich nicht um floating-point (oder eine tabelle im datenflash) dum herumkommt. das ist der größte knackpunkt nach dem hardware-multiplier (der laut app-note ja machbar ist) zu den syntheseformen : - also fm halte ich mit dem avr machbar (4-6 siusoszillatoren mit hüllkurve) - wavetable sowieso (ist ja nix anderes als ein sample-player, egal ob fertige samples oder wellenformzüge die als oszillator laufen - pd (phase distortion) kenn ich leider nicht so gut, dürfte aber machbar sein - additive synthese ist machbar, aber eine frage der anzahl der oszillatoren. ich habe in meinem kawai k5000 synthesizer 128 oszillatoren pro stimme. das dürfte der mega nicht schaffen :-) aber man kann sich ja evtl mit 64 oszillatoren und einer stimme begnügen. obwohl ich mit den megas noch nicht viel gemacht habe, werde ich das projekt hier weiterverfolgen. ist echt interessant was ihr alles aus nem mega rauskitzelt :-)) gruß rene
Datum: 12.04.2007 15:35
nochmal @travelrec wenn du fragen zum thema iir filter hast kannst du gerne nachfragen. werde auch (sofern ich zeit dazu habe) in meiner audio-projekt-doku ein kleines kapitel darüber schreiben (kann aber noch dauern)
Datum: 12.04.2007 20:07
Der Link zum Programm ATMEAG8SID.zip funktioniert nicht.
Datum: 12.04.2007 21:23
Hallo, @Sigint 112: so ein Exemplar habe ich hier auch noch gefunden, Ausgang tot, 0V... Gruß aus Berlin Michael
Datum: 12.04.2007 22:15
>Der Link zum Programm ATMEAG8SID.zip funktioniert nicht.
Upps, da ist mir beim rumschieben was schief gegangen. Jetzt geht er
aber wieder!
Gruss,
Christoph
Datum: 13.04.2007 07:19
TheMason: Bevor ich mich an die Filter mache, muß ich mich erst einmal um elementare Probleme kümmern: der CS4334 verlangt ein zur Masterclock synchrones High-Speed Interface (I2S) welches ich auf dem Mega nicht mit dem internen SPI hinbekomme, was ich aber gehofft hatte. Jetzt werde ich einen Tiny2313 als ein solches Interface programmieren und mittels Interruptverbindung an den Mega anschließen. Damit wäre ein 100% synchrones Timing hinzubekommen, ohne daß der Mega ständig nur am Datenschaufeln ist. Wenn das klappt, dann geht´s in Sachen Soundprogrammierung weiter. Schöne Grüße, TravelRec.
Datum: 13.04.2007 08:07
Hallo Sigint, > Ich hab noch nen analogen Tiefpass an den Ausgang gehangen... hat die > PWM-Frequenz relativ gut unterdrückt. Ich werde bei Gelegenheit mal die > sound.c ändern. Ich habe schon mit dem Gedanken gespielt, einen 16Bit DA-Wandler ( TDA1543 ) an den Atmega8 zu hängen. Dann bräuchte man die hohe PWM-Frequenz nicht und könnte sich den 16MHz-Quartz sparen. Der Anschluss eines 16Bit-DA-Wandler würde aber meiner minimalistischen Zielsetzung wiedersprechen, mit kleinstem Bauteilaufwand den maximal möglichen Sound herauszuholen. Der Vorteil bei der Verwendung möglichst weniger Bauteile ist, dass jeder die Schaltung nachbauen kann und selbst ein wenig damit experimentieren kann. @alle anderen Wenn man richtige Syntysizer mit großen Filterbänken entwickeln will, dann sollte man wenigstens einen ARM, einen größeren DSP oder ein LINUX-embedded System benutzen oder gleich auf dem PC programmieren und sich nicht mit einem AVR zu quälen. Das Feld ist wohl auch schon ziemlich umfangreich bearbeitet worden, so dass man im Netz sicherlich haufenweise Projekte und Programme findet
Datum: 13.04.2007 08:52
Was hältst du als Alternative von einen R2R D/A Wandler? Brauchst halt noch je nach Auflösung mindestens 8 freie Portpins Gruß Roland
Datum: 13.04.2007 09:32
Der Nachteil wäre: Ee sind halt schon wieder ein paar Bauteile mehr. Aber finde ich die Idee nicht schlecht. Ich habe bis jetzt nur noch nie ein R2R Netzwerk ausprobiert und kann deshalb nicht einschätzen, welche Genauigkeit man erreichen kann. Irgendwo habe ich auch mal gesehen, dass es fertige R2R Netzwerke als Bauteil gibt. Aber bei Reichelt oder dem C habe ich nichts gefunden. Vielleicht könnte man mit dem R2R Netzwerk ja auch einen 10Bit Wandler machen, dann hätte man etwas mehr Dynamik. Das Programm rechnet ohnehin eher mit 10Bit, da die 3 Kanäle intern addiert werden. Gruß, Christoph
Datum: 13.04.2007 10:35
So nen R2R dac ist halt nen Widerstandsgrab, für 8 bit glaub ich 24 gleiche Widerstände. Aber mit SMD Widerständen lässt sich das auch relativ klein aufbauen. Dann braucht man noch nen kleinen OPV zur Impedanzwandlung und gut ist. Vielleicht noch nen Tiefpass zum filtern der "Hochfrequenten" anteile, die beim schalten von einer auf eine andere Stufe entstehen und gut ist.
Datum: 13.04.2007 11:12
Datum: 13.04.2007 14:37
So da bin ich wieder.... ich hab gestern mal etwas mit C rumgespielt und aufm PC einen SID-Player zusammengehackt. Leider hab ich null Ahnung von der ganzen Materie, so daß das Ergebniss eher bescheiden ist. Aber man kann erkennen, welche Lieder abgespielt werden ;-) Bis jetzt hab ich nur 3 Stimmen (Sinus,Dreieck,Rechteck,Rauschen) und einen, nicht wirklich funktionierenden, Hüllkurvengenerator. Den 6502 Kern hab ich aus dem Netz... der scheint gut zu funktionieren. Mal schauen, was ich noch an Erfahrungen an meinem Player sammeln kann. Vielleicht kann ich ja doch was zum ATmega-Sidplayer beitragen. ;-) @Christoph: Das mit dem R2R-Netzwerk finde ich eigentlich auch ne gute Idee. Das ist preiswerter als der DAC und Widerstände hat man immer griffbereit. Aber es dürfte ja nur ein kleines Problem sein beides zu ermöglichen. (R2R und DAC) Ein 10bit R2R ist wahrscheinlich kein Problem... stellt sich nur die Frage, ob das viel bringt. Rechnerisch definitiv.. aber praktisch?!? @Andreas: Sinnvoll ist das wahrscheinlich nicht... aber sind Computerspiele und PS-Boliden sinnvoll?!? Es geht immer um den Spassfaktor: Irgendwas zu realisieren, was zuvor keiner für möglich gehalten hat. Ich würde wetten, daß ein SID-Player oder ein Synth mit einem ARM oder einem DSP kein großes Problem ist. Aber ein AVR ist sehr viel einfacher im Handling als ein ARM... das ist schon ein Vorteil. Preislich ist der ARM7TDMI ja fast so preiswert wie ein ATmega32... also kein Vorteil des AVR. Gruß, SIGINT
Datum: 13.04.2007 14:39
>Nehmt doch einen >AT91SAM7, da lässt sich jeder Audio-DAC problemlos anschließen, und die >Rechenleistung ist sehr viel höher. Die Herausforderung und der Spaß an der Sache ist ja gerade mit minimalen Resourcen das Maximale zu erreichen. Das können nur wenige. Vor allen Dingen weil man dazu spezielle Optimierungstricks benötigt, die eben nicht jeder beherrscht. Im anderen Thread haben zuerst 4 Leute behautptet, es wäre unmöglich, einen 6502 Emulator auf einem Atmega zu realisieren, bis Michael dann seine Lösung vorgestellt hat. Dann haben wieder 4 andere Leute behauptet, es wäre unmöglich mit einem Atmega einen SID zu realisieren, bis jemand im Netz einen 8 stimmigen SID gefunden hat und ich meine Atmega8-C-SID-Emulation veröffentlicht habe. Bei einem ARM hätte kaum jemand Zweifel, dass es geht. Gruss, Christoph
Datum: 13.04.2007 14:56
P.S.: Wenn es jemanden interessiert. Ein SID ohne Hüllkurven, Filter, etc... hört sich so an: http://de.geocities.com/sigint112/SID-PLAY.mp3 ;-)))
Datum: 13.04.2007 16:21
Hallo, @Christoph H.: Du triffst den Nagel auf den Kopf. :) Ich brauche keinen SID-Olayer, er wird, wenn er spielt, wohl auch nur in der "Sammlung nutzloser Objekte" landen. Das hindert mich aber vorerst nicht daran, das Ding spielbar zu machen. Ich denke inzwischen, daß Deine SID-Emu mit in einen Mega8515 oder Mega162 reinpßsst und auch spielbat zu bekommen sein müßte. Zumindest mit den SID-Mods, die im 20ms-VBLANC-Irq laufen. DA SOLLTE AUCH NOCH Luft für Rechnerei des SID bleiben, zur Not eben teilweise in Tabellen auslagern und den Flash vollmachen... Gruß aus Berlin Michael
Datum: 13.04.2007 17:21
>Ich brauche keinen SID-Olayer, er wird, wenn er spielt, wohl auch nur in >der "Sammlung nutzloser Objekte" landen. Ja, eine Sammlung nutzloser Objekte ist etwas schönes, ich habe auch ein paar. >P.S.: Wenn es jemanden interessiert. Ein SID ohne Hüllkurven, Filter, >etc... hört sich so an: >http://de.geocities.com/sigint112/SID-PLAY.mp3 Hey, klingt gar nicht schlecht! Kannst Du davon nicht ein SID-Register-Dump machen, damit ich das mal in den Emu einbinden kann? Gruss, Christoph
Datum: 14.04.2007 10:49
Hi Christoph, ich hab mal versucht ein Registerdump zu machen. Ein Tick sind 1/22050s ... man sieht, daß ca. alle 441 Ticks sich die Register ändern. Das ergibt ziemlich genau 50Hz :-) Allerdings hab ich mittlerweile einige schwerwiegende Fehler in meinen Überlegungen entdeckt: Während eines Audiosamples lasse ich die 6502 mehrere Hundert Tackte arbeiten, ohne die SID-Register zu prüfen... das muss ich wohl irgendwie abfangen. Ich hab nämlich eben das "GATE" Bit im SID gefunden und bin mir nun im klaren, warum mein Hüllkurvengenerator nie wirklich funktioniert hat. ;-) Aber da sieht man wieder mal: Aus Fehlern lernt man. Gruß, SIGINT P.S.: Die Register sind einfach aufsteigend sortiert: Links->Reg0 Rechts->Reg25
Datum: 15.04.2007 14:56
Hi zusammen, ich hab mal versucht die Hüllkurven bei meinem SID-Player einzubauen. Die Ergebnisse sind ganz ok... aber gut ist das leider nicht nicht wirklich. Ich werd nächste Woche mal anfangen mit den AVRs rumzuspielen. Vielleicht bekomm ich da einen einfachen DDS-Synth hin. Hier aber ertsmal mein akuteller Player: Tonbeispiel: http://de.geocities.com/sigint112/prody_the_pengui... Den 6502 Kern hab ich von dieser Seite: http://www.zophar.net/tech/6502.html (Neil Bradkey) ... Ich hab das Teil nur minimal modifiziert: A_Reg setzen PSID-Lader: http://de.geocities.com/sigint112/psid.c Der Player: http://de.geocities.com/sigint112/main.c Der Code ist echt ne katastrophe... aber ich bin noch beim lernen. Gruß, SIGINT
Datum: 16.04.2007 07:41
Hallo nochmal: Die Anbindung vom Mega128 an den I2S-DAC CS4334 funktioniert, ein Tiny2313 realisiert das Interface zwischen beiden, leider fehlt mir in den nächsten Tagen die Zeit zum Programmieren. Ich melde mich nochmal, sobald es etwas handfesteres gibt. Schöne Grüße! TravelRec.
Datum: 16.04.2007 09:24
Datum: 16.04.2007 13:36
Das wird bei dem CS4334 aber nichts, weil der seine I2S-Signale synchron zur Masterclock (in dem Fall 16Mhz / 512 x 32 Bits) braucht. Wenn der Mega128 das Timing selbst übernehmen soll, dann kann er nichts anderes mehr machen, weil es mit dem Hardware-SPI nicht geht. Die alten TDA15xx DACs hatten nur den I2S-Bus und haben entsprechend der WordClock gewandelt, mit allem Jitter, der halt über die Schnittstelle so mitkam. Sie waren außerdem 16-Bit R2R Wandler mit Stromausgang. Der CS4334 ist ein hochgenauer 1-Bit-Wandler (geht bis 96kHz bei 24-Bit Sampleauflösung) und der braucht für seine sehr gute Ausgangscharakteristik auch sehr genaues Timing.
Datum: 16.04.2007 14:07
interressant, was heißt stromausgang? Das man da direkt einen speaker/Kopfhörer anschließen kann? Machen die TDA15xx keine 16 bit? Aber so ein TDA15xx ist bestimmt besser als selbst gemachtes R2R oder PWM oder?
Datum: 16.04.2007 16:29
>interressant, was heißt stromausgang? Das man da direkt einen >speaker/Kopfhörer anschließen kann? Nein. Der DAC erzeugt einen dem digitalen Eingangssignal entsprechenden analogen Strom über einem fest definierten Lastwiderstand. Dieser Strom muß mit einem Operationsverstärker in eine belastbare Spannung gewandelt werden (Impedanzwandler). >Machen die TDA15xx keine 16 bit? Doch schon, aber mit den für R/2R-Netwerke typischen Nichtlinearitäten. Der CS4334 ist durch seine 1-bit-Technologie weitestgehend linear. Außerdem sind die Verzerrungen äußerst gering. >Aber so ein TDA15xx ist bestimmt besser als selbst gemachtes R2R oder >PWM oder? Ja, aber nur wenn Du ihn noch irgendwo bekommst. Wird nicht mehr hergestellt. Die neueren Wandler sind meistens besser, erfordern aber auch kompexere oder genauere Schnittstellen.
Datum: 17.04.2007 20:25
Hallo SIGINT, es ist grad so schönes Wetter und man kommt wenig zum programmieren. Heute habe ich den Register-Dump mal überflogen. > ich hab mal versucht ein Registerdump zu machen. Ein Tick sind >1/22050s ... Beim Durchsehen gabe es für mich eine Unklarheit: Die Tick-Angaben im Dump schwankt zwischen 1 und 440. Ich nehme an, es ist immer das entspricht immer der Zeitdifferenz zur letzten Veränderung der Register. Was mich wundert, manchmal verändern sich auch die Werte innerhalb der 1-Tick Spanne. Gruss, Christoph
Datum: 18.04.2007 17:15
Ja, das liegt daran, da ich bei jeder 1/22050s nachschaue ob sich ein Register geändert hat. Wenn sich nichts geändert hat, dann wird Ticks um eins erhöht, ansonsten auf 0 gesetzt und der Text geloggt. Also sollte sich jede Zeile ändern. Daß sich überhaupt bei einem Tick was ändert dürfte der oben genannte Denkfehler von mir sein. Ich hatte folgende Idee: Änderungen der Soundausgabe sind nur hörbar, wenn sie größer oder gleich 1/22050s (meine Samplerate ist 22050) sind... also lasse ich die CPU genau die Taktzahl einer 1/22050s durchlaufen und rufe dann meine Soundroutine auf. Allerdings kann es ja sein, daß die Play-Routine der SID-Datei in einem Aufruf mehrfach auch ein SID-Register zugreift. Ich muss also alles nochmal neu überdenken... nur hab ich keinen Plan, wie ich die 6502 CPU und die Sounderzeugung einigermassen Zyklengenau parallel laufen lassen kann. Wenn ich Threads verwende, dann hab ich riesen Performanceprobleme... wahrscheinlich durch den Overhead des Taskswitchings. Ich bin da im Moment leider total Ratlos... Gruß, SIGINT
Datum: 18.04.2007 17:56
Hallo, Du mußt vermutlich nicht zyklengenau arbeiten. Die meisten Files (jetzt mal Samples nicht beachtet, habe ich mir nocht nicht angesehen und sollte auch eher die Ausnahme sein) spielen im VBLANC-IRQ. Es werden also alle 20ms die Register des SID aktualisiert, das auch ohne Rücksicht auf Zeitabläufe, nur so, wie eben der Programmcode der SID-IRQ-Routine aufgebaut ist. Cauldron (Hexenküche) von Pallas z.B. legt die nächsten Daten für den SID in einen Ram-Bereich und kopiert dann in einem Loop alle Werte nacheinander in alle SID-Register, von $D418...$D400 allo schpn nacheinander, egal, ob neue Werte oder die alten. Du brauchst also eigentlich nur für jeweils einen IRQ-Durchlauf alle Register und Werte loggen, die muß er dann eben alle 20ms wieder in den SID schreiben. Mein Programm hängt nach dem Umbau im Moment beim Durchlauf der IRQ-Routinen irgendwo, daß muß ich erst suchen und beheben. Gruß aus Berlin Michael
Datum: 19.04.2007 10:22
@Michael: Hmm, ich muss da mal ein bisschen rumspielen. Sorgen machen mir ein wenig die "TEST" und "GATE" Flags. Wenn ich das richtig verstanden habe, dann reagieren die auf eine Flanke. Also muss ich bei jedem Prozessorzyklus schauen, ob die Flags geändert wurden damit ich das nicht verpasse. Ansonsten hab ich noch herasgefunden, daß ich irgendwie Timingprobleme habe. Da muss ich aber selbst mal nachschauen... trotzdem anbei noch mal den Source.(Wenn jemand interesse hat) Gruß, SIGINT
Datum: 19.04.2007 21:16
Hallo, Info zwischendurch: Beitrag "6502 Emulation auf AVR ?" Der SID spielt am Mega8515 "Pink Panther" :-))) Gruß aus Berlin Michael
Datum: 20.04.2007 12:07
Ich glaube ich muss mir mal ein paar Mega8515 bestellen.... dann kann ich deinen Code mal testen und SwinSID aufbauen. Dann hab ich ja schon fast das, was ich haben wollte :-) Besser wäre natürlich eine SID-Emulation auf OpenSource basis... aber man nimmt, was man bekommt ;-) Gruß, SIGINT
Datum: 21.04.2007 08:33
Hallo SIGINT, >Besser wäre natürlich eine SID-Emulation auf OpenSource basis... aber >man nimmt, was man bekommt ;-) Eigentlich ist mein SID-Emulator ja Open Source, Du kannst Dir den Quellcode hier http://www.roboterclub-freiburg.de/atmega_sound/at... herunterladen. Die Voice-SID-Register für die Kanäle 1-3 sind implementiert. Was fehlt, ist der Filter. Vielleicht finde ich mal irgendwann Zeit dazu ... Mittlerweile habe ich auch das Bild eines minimalistischen Versuchsaufbaus und ein MP3-File der Testklänge auf die Seite gestellt. Beim Versuchsaufbau wäre es natürlich schön, wenn man sich den Quarz auch noch sparen könnte, aber dazu müsste das Programm vollständig in Assembler umgeschrieben werden. Gruss, Christoph
Datum: 21.04.2007 10:16
Autsch, da hab ich ganz den Überblick verloren ;-) An dein Projekt hatte ich garnicht mehr gedacht. Wäre ja klasse, wenn man alle Teile zu einem Player zusammenführen könnte. Wenn ich die Zeit finde, dann werd ich mich mal ransetzen. Gruß, SIGINT
Datum: 21.04.2007 12:15
Hallo, naja, das mit dem verlorenen Überblick kommt mir bekannt vor, mir fehlt er im Moment auch etwas, wer welche Absichten verfolgt. ;))) @Christoph H.: ich habe mir die Sourcen mal runtergeladen. Sieht so auf den ersten Blick nicht sooooo kompliziert aus, den Kram mal nach Assembler zu tragen. Ich weiß nur nicht, wnn ich dazu komme... Dann würde ich es versuchen, ob es sich in meinen Code reinhängen läßt. Vermutlich dann auf einen Mega162 wegen des Platzes, den externen Ram brauch ich ja noch. Was ich auch auf die Schnelle noch machen könnte: die Debug-Ausgabe der SID-Zugriffe so zu formatieren, daß es jemand, der es braucht, direkt includen könnte. Müßte ich nur wissen, wie es aussehen soll. Ich werde erstmal ein paar SID-Files zum Test raufspielen, sind vermutlich alles simple Sachen aus alten Games, ich denke aber, zum Testen gut zu gebrauchen. Eine Playroutine müßte dann nur die Tabelle abarbeite, 1x direkt zu Beginn den Init des SID und dann alle 20ms den nächsten Tabellenblock einfach in den SID bzw. die Emu laden. Format Adresse,Daten (jeweils ein Byte) Blockende mit 0,0 ? In Assembler würde ich den Kram dann nur ins Flash legen, Zeiger auf den Beginn. Dann Routine aufrufen, die je 2 Byte holt und Zeiger erhöht, wenn die 0,0 kommen, Zeiger merken und raus, sonst an die SID-(Emu)-Adresse. Dann 20ms IRQ freigeben und in der IRQ-Routine Zeiger holen und das Gleiche machen. Keine Ahnung jetzt, wie das in C mit der Tabelle geht, asl großes Array wohl? Gruß aus Berlin Michael
Datum: 21.04.2007 20:03
Hallo Michael, >Was ich auch auf die Schnelle noch machen könnte: die Debug-Ausgabe der >SID-Zugriffe so zu formatieren, daß es jemand, der es braucht, direkt >includen könnte. Müßte ich nur wissen, wie es aussehen soll. Wie die Tabelle für den Atmega-Sid Simulator aufgebaut ist, steht im File sound.c, welches nichts anderes als eine Flash-Tabelle ist. Das Format ist ausführlich in dieser Datei beschrieben und eigentlich auch ziemlich einfach: { registeradresse,wert, registeradresse,wert, ..... } Zusätlich werden Registeradressen, die keine SID-Adressen sind, als Kommandos für's Abspielen interpretiert. Es gibt folgende Kommandos: Delay[ms] STOP REPEAT Die stehen auch in der Datei beschrieben. >Eine Playroutine müßte dann nur die Tabelle abarbeite, 1x direkt zu >Beginn den Init des SID und dann alle 20ms den nächsten Tabellenblock >einfach in den SID bzw. die Emu laden. Das Delay-Kommando in meinem Emulator benötig 4 Byte und sieht so aus: 0xF0,pauselowvalue, 0xF1,pausehighvalue, Der Wert wird in Millisekunden interpretiert. Wenn man's mit konstanter Ausgabe macht, könnte man das natürlich sparen. Ich habe aber beim Stück pink.sid gesehen, dass dort die Ausgaberate verändert wird. Gruss, Christoph
Datum: 21.04.2007 21:08
Hallo, die Play-Routine wird alle 20ms aufgerufen, wenn nichts an den SID zu schicken ist, geht es wieder raus. Ich würde die Tabelle auch so anlegen, also -> registeradresse,wert, registeradresse,wert, ..... $FF,$FF (0,0 geht nicht, wäre ja Register 0 mit Wert 0 und damit möglich) -> registeradresse,wert, registeradresse,wert, ..... $FF,$FF -> $FF,$FF (hier wird einfach nichts gemacht). -> registeradresse,wert, registeradresse,wert, ..... $FF,$FF -> usw. Die überwiegende Mehrheit der SID-Files spielt nur im 50/60Hz-IRQ. Einfach deshalb, weil der Sound nicht Selbstzweck war, sondern als Nebenbeschäftigung auf dem C64 gespielt wurde. Damit durfte auch die CPU-Last nicht höher als nötig sein. Über Ausnahmen denke ich erst später nach, erstmal muß ich rausfinden, warum Cauldron und Boulderdash-Inro nicht laufen, zumindest Cauldron läuft auch im IRQ, bekommt aber falsche Daten... Gruß aus Berlin Michael
Datum: 22.04.2007 21:01
Hallo Michael, könntest Du die 20ms Verzögerung eventuel auch als 0xF3,20, statt 0xFF,0xFF, ablegen? Das wäre super, dann wäre es kompatibel zum Atmega8SID. Heute habe ich einge Fehler im Emulator beseitigt, deshalb steht jetzt hier http://www.roboterclub-freiburg.de/atmega_sound/at... die Version 1.2 zum download bereit. Folgende Fehler habe ich beseitigt: - Hüllkurven hatten Fehler - Falls die Filterregister gesetzt sind, werden die Signale, welche normalerweise durch die Filter laufen, auf 1/4 gedämpft. Ich habe festgestellt, dass sonst die Rauschgeneratoren bei bestimmten SID-Stücken alles andere übertönen. Schönen Sonntag noch, Christoph
Datum: 22.04.2007 21:52
Hallo, kein Problem, ging ja nur darum ein SID-Daten-Ende zu nehmen, daß sich von den SID-Daten eindeutig unterscheidet. Damit geht ja alles ab 0x1D,0x00. 0x1C ist ja das letzte SDI-Register. Ich mußte am Wochenende erstmal etwas PHP/MySQL machen, hat so leider nur zwischendurch für dumme Bemerkungen im Forum gereicht. So als Entspannung... ;))) Mal sehen, wie es morgen abend so ausschaut. Gruß aus Berlin Michael
Datum: 24.04.2007 17:28
Hallo, ihr seid ja Profis in Sachen Sounderzeugung, dazu habe ich mal eine Frage. Ich erzeuge Töne über PWM und gebe diese an einem Piezo aus. Wenn ich es richtig verstehe kommt ja ein Rechtecksignal am Port raus. Durch Änderung der Frequenz wird die Tonhöhe festgelegt. Die Töne sind nicht sehr schön und ich möchte die Tonausgabe verbessern. Es sollte sich gedämpfter anhören. Ähnlich einem Gongefekt. Wie kann man sowas ohne externe Bauteile am einfachsten in C realisieren? Ich bin für jeden Tip dankbar. Gruß Michael
Datum: 24.04.2007 18:00
@michael aus nem piezo wirst du nicht viel rausholen können. betreib das ganze mal mit nem transistor und nem lautsprecher. da dürfte das ganze schon etwas anders klingen. wenn du unbedingt den piezo verwenden willst, spendier ihm noch einen kondensator (probler mal mit verschiedenen werten von 470pf-10nf oder so). sonst fällt mir auf die schnelle nix ein. gruß rene
Datum: 24.04.2007 20:50
Hallo Michael,
>Ich erzeuge Töne über PWM und gebe diese an einem Piezo aus.
Eine Piezoscheibe klingt immer etwas bescheiden, da sie meist ausgeprägt
Resonanzen und einen ansonsten ziemlich beschränkten Frequenzgang hat.
Die Dinger sind hauptsächlich für Armbanduhren als Warnton geeignet.
Bei meinen Experimenten habe ich mir einfach eine NPN-PNP
Gegentaktenstufe gebastelt. Die muss keine Audioqualitäten haben, das
sie das PWM-Signal überträgt. Am Ausgang hängt ein R-L Tiefpass. Ist
eigentlich ein Clas-D-Verstärker. Dann die Lautsprecherbox meiner
Stereoanlage.
Wenn ich meine PC-Lautsprecher aus der Soundkarte ausstöpsele und direkt
an den PWM-Ausgang des Atmega8 hänge, klingts noch viel besser.
Gruss,
Christoph
Datum: 27.04.2007 22:38
Sodele, mittlerweile ist es mir gelungen, einen Atmega168 zu verwenden, da passen schon ein paar Sekunden mehr SID-Musik rein. Hier gibt es das neue Sound-Beispiel: http://www.roboterclub-freiburg.de/atmega_sound/at... Das Beispiel habe ich mit Hilfe von Phillips Programm aus der High-Volage Collection umgewandelt. Die Ausgabedaten von Phillips Programm mussten dann noch mal mit einem anderen Konvertierungsprogramm in die Flash-Tabelle umgerechnet werden. Bei dem SID-Emulator fehlen immer noch die Filter. Die könnte das Schlag/Rauschgeräusch vielleicht etwas besser klingen lassen. Aber als Ausgangssignal eines 8Bit PWM-Ausgangs finde ich das Ergebnis schon mal ganz passabel. Gruss, Chistoph
Datum: 06.05.2007 22:12
Hallo Cristoph, kann man das ganze auch mit dem Intenen 8MHZ Oscillator vom ATMEGA8 machen? Wenn ja, könntest du mir dabei helfen?
Datum: 07.05.2007 18:19
Hallo Eltor, warum möchtest Du keine 16Mhz Quarz verwenden? In einem Post hat SIGINT 8Mhz verwendet, es scheint zu funktionieren. Mit 16 Mhz hat man die bessere Tonqualität wegen doppelter PWM-Frequenz und beserer Frequenzauflösung. Wenn man das aktuelle Programm halb so schnell laufen läst, ist es wie ein langsamer Platenspieler, alle Töne haben die halbe Frequenz und dauern doppelt so lang. Die Frequenzumrechnung könnte man im Programm natürlich anpassen. Gruss, Christoph
Datum: 07.05.2007 19:02
Naja, ich bin mir nichtmehr sicher, ob das wirklich richtig war was ich gehört hab. Wahrscheinlich hab ich das nur falsch interpretiert. Ich hab mir mal ein paar Gedanken zum SID-Player gemacht. (Ich hab im Moment viel um die Ohren und komme nicht dazu mehr mit AVRs rumzuspielen) Wenn ich den 6502emu aus dem Parallelthread nehme, 64k SRAM dranpappe und dann deinen SIDemu mit einem D-Latch an den Adressbus bastel, dann sollte das doch eigentlich funktionieren.Das Latch sollte als Zwischenspe