www.mikrocontroller.net

Forum: Codesammlung ATMEGA8 Soundgenerator/Synthizer

Autor: Christoph H. (Gast)
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
Autor: Roland Praml (pram)
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 ;-)
Autor: Sigint 112 (sigint)
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
Autor: Christoph H. (Gast)
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
Autor: Sigint 112 (sigint)
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
Autor: Michael (Gast)
Datum: 11.04.2007 18:37

Kann man da auch einen piezo zum testen anhängen oder taugt das nicht?
Autor: Michael U. (Gast)
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
Autor: TheMason (Gast)
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
Autor: Travel Rec. (travelrec) Benutzerseite
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.
Autor: TheMason (Gast)
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 :-))
Autor: Christoph H. (Gast)
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

Autor: Christoph H. (Gast)
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
Autor: Travel Rec. (travelrec) Benutzerseite
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.
Autor: Travel Rec. (travelrec) Benutzerseite
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.
Autor: Sigint 112 (sigint)
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
Autor: Christoph H. (Gast)
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
Autor: TheMason (Gast)
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
Autor: TheMason (Gast)
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)
Autor: wolf (Gast)
Datum: 12.04.2007 20:07

Der Link zum Programm ATMEAG8SID.zip funktioniert nicht.
Autor: Michael U. (Gast)
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
Autor: Christoph H. (Gast)
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
Autor: Travel Rec. (travelrec) Benutzerseite
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.
Autor: Christoph H. (Gast)
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


Autor: Roland Praml (pram)
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
Autor: Christoph H. (Gast)
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
Autor: Hauke Radtki (lafkaschar) Benutzerseite
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.
Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite
Datum: 13.04.2007 11:12

Ob das wirklich sinnvoll ist, einen kleinen AVR bis auf das letzte Hz
Taktfrequenz und das letzte Bit Flash auszureizen? Nehmt doch einen
AT91SAM7, da lässt sich jeder Audio-DAC problemlos anschließen, und die
Rechenleistung ist sehr viel höher.
Autor: Sigint 112 (sigint)
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
Autor: Christoph H. (Gast)
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
Autor: Sigint 112 (sigint)
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

;-)))
Autor: Michael U. (Gast)
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
Autor: Christoph H. (Gast)
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
Autor: Sigint 112 (sigint)
Datum: 14.04.2007 10:49
Dateianhang: dump.zip (6,1 KB, 63 Downloads)

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
Autor: Sigint 112 (sigint)
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
Autor: Travel Rec. (travelrec) Benutzerseite
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.
Autor: Marius (Gast)
Datum: 16.04.2007 09:24

warum noch einen controller dazwischen? Hier hat irgendwo mal einer eine
Seite gepostet wo jemand mit einen AVR den SID ersetzt hat, dort wurde
ein I2S DAC direkt an den AVR gestöpselt
Autor: Travel Rec. (travelrec) Benutzerseite
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.
Autor: Marius (Gast)
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?
Autor: Travel Rec. (travelrec) Benutzerseite
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.
Autor: Christoph H. (Gast)
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
Autor: Sigint 112 (sigint)
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
Autor: Michael U. (Gast)
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
Autor: Sigint 112 (sigint)
Datum: 19.04.2007 10:22
Dateianhang: main_thread.c (12,7 KB, 186 Downloads) | formatierter Code

@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
Autor: Michael U. (Gast)
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
Autor: Sigint 112 (sigint)
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
Autor: Christoph H. (Gast)
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
Autor: Sigint 112 (sigint)
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
Autor: Michael U. (Gast)
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






Autor: Christoph H. (Gast)
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

Autor: Michael U. (Gast)
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

Autor: Christoph H. (Gast)
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
Autor: Michael U. (Gast)
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
Autor: Michael (Gast)
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

Autor: TheMason (Gast)
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
Autor: Christoph H. (Gast)
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
Autor: Christoph H. (Gast)
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
Autor: Eltor (Gast)
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?
Autor: Christoph H. (Gast)
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
Autor: Sigint 112 (sigint)
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