Forum: Projekte & Code ATMEGA8 Soundgenerator/Synthizer


von Christoph H. (Gast)


Lesenswert?

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/atmegaSID.html

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

von Roland P. (pram)


Lesenswert?

Einen kleinen Tiefpass sollte man schon noch spendieren, nicht dass 
einem noch die Hochtöner von der Hifi-Anlage abrauchen ;-)

von Sigint 112 (sigint)


Lesenswert?

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

von Christoph H. (Gast)


Lesenswert?

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

von Sigint 112 (sigint)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

Kann man da auch einen piezo zum testen anhängen oder taugt das nicht?

von Michael U. (Gast)


Lesenswert?

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

von TheMason (Gast)


Lesenswert?

@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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von TheMason (Gast)


Lesenswert?

@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 :-))

von Christoph H. (Gast)


Lesenswert?

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


von Christoph H. (Gast)


Lesenswert?

@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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Sigint 112 (sigint)


Lesenswert?

@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

von Christoph H. (Gast)


Lesenswert?

> 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

von TheMason (Gast)


Lesenswert?

@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

von TheMason (Gast)


Lesenswert?

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)

von wolf (Gast)


Lesenswert?

Der Link zum Programm ATMEAG8SID.zip funktioniert nicht.

von Michael U. (Gast)


Lesenswert?

Hallo,

@Sigint 112: so ein Exemplar habe ich hier auch noch gefunden, Ausgang 
tot, 0V...

Gruß aus Berlin
Michael

von Christoph H. (Gast)


Lesenswert?

>Der Link zum Programm ATMEAG8SID.zip funktioniert nicht.

Upps, da ist mir beim rumschieben was schief gegangen. Jetzt geht er 
aber wieder!

Gruss,
Christoph

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Christoph H. (Gast)


Lesenswert?

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



von Roland P. (pram)


Lesenswert?

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

von Christoph H. (Gast)


Lesenswert?

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

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

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.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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.

von Sigint 112 (sigint)


Lesenswert?

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

von Christoph H. (Gast)


Lesenswert?

>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

von Sigint 112 (sigint)


Lesenswert?

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

;-)))

von Michael U. (Gast)


Lesenswert?

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

von Christoph H. (Gast)


Lesenswert?

>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

von Sigint 112 (sigint)


Angehängte Dateien:

Lesenswert?

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

von Sigint 112 (sigint)


Lesenswert?

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_penguin_parrot.mp3
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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Marius (Gast)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Marius (Gast)


Lesenswert?

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?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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

von Christoph H. (Gast)


Lesenswert?

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

von Sigint 112 (sigint)


Lesenswert?

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

von Michael U. (Gast)


Lesenswert?

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

von Sigint 112 (sigint)


Angehängte Dateien:

Lesenswert?

@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

von Michael U. (Gast)


Lesenswert?

Hallo,

Info zwischendurch:

Beitrag "6502 Emulation auf AVR ?"

Der SID spielt am Mega8515 "Pink Panther" :-)))

Gruß aus Berlin
Michael

von Sigint 112 (sigint)


Lesenswert?

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

von Christoph H. (Gast)


Lesenswert?

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/atmegaSID.html
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

von Sigint 112 (sigint)


Lesenswert?

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

von Michael U. (Gast)


Lesenswert?

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







von Christoph H. (Gast)


Lesenswert?

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


von Michael U. (Gast)


Lesenswert?

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


von Christoph H. (Gast)


Lesenswert?

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/atmegaSID.html 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

von Michael U. (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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


von TheMason (Gast)


Lesenswert?

@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

von Christoph H. (Gast)


Lesenswert?

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

von Christoph H. (Gast)


Lesenswert?

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/atmegaSID2.mp3

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

von Eltor (Gast)


Lesenswert?

Hallo Cristoph,
kann man das ganze auch mit dem Intenen 8MHZ Oscillator vom ATMEGA8 
machen?
Wenn ja, könntest du mir dabei helfen?

von Christoph H. (Gast)


Lesenswert?

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

von Sigint 112 (sigint)


Lesenswert?

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 
Zwischenspeicher doch reichen, bis der ATmega8 im Interrupt ist und die 
Daten entgegennehmen kann. Wobei hierfür wahrscheinlich 16MHz besser 
sind.

Gruß,
   SIGINT

von Michael (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich möchte den SID nachbauen, habe aber bisher noch kein Erfolg.

Hardware: ATMEGA168 mit 16Mhz
beschaltet wie auf dem Bild vom Roboterclub
Fusebits gesetzt wie im Anhang
Programm wie im Anhang

Vielleicht könnte da mal jemand drüber schauen und mir sagen was ich 
falsch mache.

von Michael (Gast)


Angehängte Dateien:

Lesenswert?

stimmen den die fusebits?

von Michael (Gast)


Lesenswert?

kann mir jemand das hex-file füe nen Atmega168 16MhZ senden?

von Stephan B. (beckersb)


Lesenswert?

Roland Praml wrote:
> Einen kleinen Tiefpass sollte man schon noch spendieren, nicht dass
> einem noch die Hochtöner von der Hifi-Anlage abrauchen ;-)

Hallo,
ich stehe mit Pässen auf dem Kriegsfuss. Ich würde mir das 
Ausgangssignal gerne mit dem Oszi anschauen. Bisher sehe ich ja nur die 
PWM. Mit diversen R-C Kombinationen habe ich es versucht, aber ich sehe 
nur "Fraktale" :-)) es sieht eher nach Wollknäuel als nach Dreieck, 
Rechteck oder Sägezahn aus. Wohin muss ich denn die Grenzfrequenz legen 
und hast Du ein ausprobierte Kombination?

Danke

Stephan

von kuk (Gast)


Lesenswert?

Hallo Ihr, und hallo Christoph.

Ich habe seit gut 2 Wochen den SID-Emu (1.8) von der Roboterclub 
Freiburg-Seite auf einem Atmega168 laufen, steuern tu ich ihn wie 
empfohlen auch über einen 2. Atmega(8), nem alten Arduino-Board...

Ersten ich bin ziemlich begeistert über die Möglichkeiten und vorallem 
das Resultat an Sound. Hatte mir schon vor 2 Jahren einen SID gerettet 
und seitdem rumliegen, aber vorallem die versch. Spannungsquellen haben 
mich abgeschreckt...

Wie auch immer, ich finde es schade und komisch, nicht mehr über das 
Projekt zu finden. Es gibt noch ein halbherziges How-To im Arduino-Wiki, 
aber irgendwie scheint nichts zu passieren. Und alle drei Seiten 
verlinken sich gegenseitig. Jetzt wollt ich hier mal anfragen in der 
Hoffnung Christoph(ch) den Autor zu treffen.

ich habe gestern begonnen (versucht) den SID_Emu in eine Arduino Library 
zu kriegen, um dann in vertrauter Umgebung Midi draufzusetzen, bzw. das 
ganze einem größeren Kreis zu öffnen. Ok, und weil das ganze bisher 
nicht so einfach war und ich auch irgendwie das Bedürfnis hätte den 
Autor zu fragen, was er sich dazu denkt, diese Nachricht hier. In der 
Hoffnung er folgt diesem Thread noch per Benachrichtigung.

oder hat sonst noch wer Erfahrung und Links zu dem Projekt? Wie sieht es 
mit dem Timing für die Kommunikation aus. Ist das alles sehr ineinander 
Verhakt? Grundsätzlich sollten sich Midi Messages ja ziemlich leicht in 
Registerwerte umwandeln lassen.

Beste Grüße,
kuk

von Michael (Gast)


Lesenswert?

Hallo kuk,

kannst Du mir bitte deine Files mit makefile zumailen?

wäre super, ich krieg meinen atmega168 nicht zum laufen.

info@verbrennerheli.de

Besten Dank
Michael

von Peter Sieg (Gast)


Lesenswert?

Hallo. Ich wollte den ATmega8SID einmal ausprobieren..
Ist das chAtmega8Gong.hex die HEX-Programmdatei für das ebenfalls auf 
der Homepage enthaltete Soundbeispiel..? Der Name 'Gong' ist halt 
anderssagend??
Die EEP Datei muß ins Flash-Memory geflasht werden.. korrekt?

Auch habe ich noch keine AVR GCC Umgebung aufgesetzt.. und leider
ist bei der Version 1.8 mit serieller Anbindung keine compilierte HEX
Datei dabei.. gibt es die irgendwo fertig..? Oder kann die bitte einmal 
jemand
hier einhängen..?

Danke!

Peter

von Peter Sieg (Gast)


Lesenswert?

ok. Habe mir WinAVR GCC Portable besorgt.. kompiliert.. und läuft auf 
Pollin Eval. Board.. Super!

Jetzt muss ich mal sehen.. wie ich die Version mit serieller Anbindung 
kompiliert bekomme... kein Makefile dabei.. habe das aus dem anderen 
Verzeichnis angepasst.. ihm fehlen aber noch die Uart Sachen.. mal 
sehen..

Peter

von Peter Sieg (Gast)


Angehängte Dateien:

Lesenswert?

So. Im Anhang ZIP Archive mit Makefile+korrigierter Source und HEX 
(Mega8) für ATmega8SID mit serieller Anbindung. Muß das aber selbst erst 
noch flashen und testen.. Korrektur: Bei ATmega8 muß es in Zeile 359 
RXEN anstatt RXEN0 heißen.

Peter

von Peter Sieg (Gast)


Angehängte Dateien:

Lesenswert?

Korrektur: Test hat nicht funktioniert.. Habe dann gesehen, das bei 
ATmega8 gar keine Baudrate gesetzt wird... habe ich entsprechend 
eingefügt..

9600 8N1

getestet und funktioniert jetzt (wenn ich auch noch nicht weiß, wie ein 
SID sinnvoll angesteuert wird).. aber das kommt als Nächstes ;-)

Korrigiertes ZIP Archive hängt an.

Peter

von Peter Sieg (Gast)


Lesenswert?

Also mit der RS232 Steuerung... das klappt irgenwie nicht..
Ich habe den Eindruck, das sich da irgendwas 'überholt'..??
Der serielle Puffer ist nur 2 Byte groß.. dann wird aber sofort
die SID Register gesetzt... sollte also eigendlich klappen..

Nur die 0xf0 Waitanweisungen machen so doch keinen Sinn..

Außerdem täte ein Code Cleanup sicher gut ;-)

Nun, z.Z habe ich wenig Muße, da tiefer einzusteigen..
Evtl. hat auch jemand mit mehr GCC Kenntnissen hier Lust, was
funktionierendes draus zu machen..

Peter

von egberto (Gast)


Lesenswert?

Du gibst auf? Schade......

von NrDesign (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich habe mir vorhin mit der auf Roboterclub-freiburg beschriebenen Hard- 
ud Software die Plattform aufgebaut. Später bin ich bei der Suche noch 
auf das Programm "SIDextractor" gestoßen. Kann mir jemand sagen, wie die 
ausgespuckten Dateien aufgebaut sind? Ich erkenne da zwar hexadezimale 
Werte, weiß aber jetzt nicht, was das Register, was den Wert beschreibt. 
Und vor Allem, wie bringe ich das dem Atmega bei?

Anbei mal so eine typische Output-Datei plus das original-SID. Ich habe 
extra ein kleineres, einfacheres genommen. Selbstverständlich habe ich 
auch kleinere da (HVSC sein dank ;). )


Gruß, NrDesign

von b00lduck (Gast)


Lesenswert?


von Christoph H. (Gast)


Lesenswert?

Sieht gut aus, sehr aufwendig.
Wo gibt es den 6502 Emulator für den Atmega32?

von AVRFREAK (Gast)


Lesenswert?

Christoph H. schrieb:
> Hallo SIGINT,es freut mich, dass es so viele Leute gibt, die sich für dieses 
Themainteressiern.Meine Hoffnung ist ja ein wenig, dass einige vielleicht mal ein 
kleinesMusikstück direkt für das SID-Emulator Programm schreiben.Man kann das 
relativ einfach tun. In der sound.c habe ich ein paar Notenfür die 
Soundgeneratoren per #define definiert ( gut, ich war etwas faulund habe nicht 
alle Noten aus dem SID-Datenblatt abgetippt ).In der aktuellen sound.c wird 
einfach mal eine Tonleiter abgespielt, einDreiklang erzeugt, die PWM mal 
durchfahren, die Ringmodulation getestetund Schußgeräusche mit dem 
Zufallsgenerator erzeugt. Die Beispiele sindglaube ich relativ einfach gehalten, 
so dass jeder seine eigene Melodieoder verschiedene Geräusche erzeugen kann, ohne 
dass er sich mit dereigentlichen Emulatorsoftware auseinandersetzen muss.Ich habe 
gesehen, dass es für den orginal-SID Wettbewerbe gibt, wer dieschönste 
Sound-Kollage mit am wenigsten Speicher erzeugen kann.Vielleicht ist es für den 
ein oder anderen eine Herausforderung, eineschöne Klangfolge oder eine Melodie in 
einen Atmega8 ohneZusatzbeschaltung hineinzuquetschen. In der aktuellen Version 
sind noch40% Flash frei, da kriegt man schon noch einige Noten unter.Ich wolle 
schon versuchen, ein paar Melodien aus irgendwelchenMIDI-Files herauszuziehen, 
aber ich habe leider keine MIDI-Filesgefunden und als ich ein wenig über das 
Format gelesen haben, erschienes mir zu kompliziert. Eigentlich bräuchte man nur 
die Tonhöhe und dieTondauer und wenn's schön klingen soll noch den Anschlag und 
denAusklang. Das könnte man einfach in den Emulator übertragen.Gruss,Christoph


ist auf jeden fall ein geiles projekt nur ich kann die sound.c nicht 
finden

von AVRFREAK (Gast)


Lesenswert?

habs gefunden war bissel sehr verteckt^^ haat nicht jmd lust die mutter 
aller sounds zu proggen??? den tetris sound ?^^ bin gerade an einer 
14*10 dotmatrix dran

von Johannes M. (Gast)


Lesenswert?

Hi,

ich habe versucht mal den SID Standallone V 1.2 mit AVR Studio 6 neu zu 
compilieren. Nach ein paar Anpassungen funktioniert das auch so weit. 
Allerdings spielt er keine Töne ab.

Hat evtl. jemand zufällig eine aktuelle Version als Source da?

Ich habe nur das Signal nach ISR (TIMER1_OVF_vect) angepasst und static 
const uint8_t sound[] PROGMEM = {
um das const erweitert.

von Johannes M (Gast)


Lesenswert?

Niemand der eine Idee oder einen Code hat der funktioniert?

von chris (Gast)


Lesenswert?

"ich habe versucht mal den SID Standallone V 1.2 mit AVR Studio 6 neu zu
compilieren. Nach ein paar Anpassungen funktioniert das auch so weit.
Allerdings spielt er keine Töne ab."

Hast Du eventuell die gelbe Leitung wie auf diesem Bild gezeigt, 
vergessen?
http://www.roboterclub-freiburg.de/atmega_sound/chMinimalSid.jpg

von Johannes M (Gast)


Lesenswert?

Ne die Leitung ist angeschlossen, funktioniert aber leider trotzdem 
nicht :-(

von chris (Gast)


Lesenswert?

>Nach ein paar Anpassungen funktioniert das auch so weit.
>Allerdings spielt er keine Töne ab."

Der Hauptzweck des Programmes, wäre Töne abzuspielen. Dann kann es fast 
nur an den Anpassungen liegen. Hast Du eine Version, die Töne erzeugt?

von Johannes M. (Gast)


Lesenswert?

Wenn ich die Standalone hex Datei brenne funktioniert es.

Ich denke es liegt an der Sound.C die man für AvrStudio 6 anpassen muss 
da ein Const verlangt wird.

Bin mir nicht sicher wie genau das anzupassen ist.

von chris (Gast)


Lesenswert?

Hmm... ich habe nur AVR-Studio4 verwendet.
Eigentlich sollte der Compiler einen Fehler auswerfen. Kannst Du den 
Output posten?

von Johannes M (Gast)


Lesenswert?

Hi,

war in Urlaub, deswegen die späte Antwort.

Hier der Output, nachdem ich die Zeile so angepasst habe"static const 
uint8_t sound[] PROGMEM = {"


------ Build started: Project: StandAL_SID, Configuration: Debug AVR 
------
Build started.
Project "StandAL_SID.cproj" (default targets):
Target "PreBuildEvent" skipped, due to false condition; 
('$(PreBuildEvent)'!='') was evaluated as (''!='').
Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Atmel Studio 
6.0\Vs\Compiler.targets" from project "C:\Users\jojo1\Documents\Atmel 
Studio\StandAL_SID\StandAL_SID\StandAL_SID.cproj" (target "Build" 
depends on it):
  Using "RunCompilerTask" task from assembly "C:\Program Files 
(x86)\Atmel\Atmel Studio 6.0\Vs\Compiler.Task.dll".
  Task "RunCompilerTask"
    C:\Program Files (x86)\Atmel\Atmel Studio 6.0\make\make.exe all
    make: Nothing to be done for `all'.
  Done executing task "RunCompilerTask".
  Using "RunOutputFileVerifyTask" task from assembly "C:\Program Files 
(x86)\Atmel\Atmel Studio 6.0\Vs\Compiler.Task.dll".
  Task "RunOutputFileVerifyTask"
        Program Memory Usage   :  3302 bytes   40,3 % Full
        Data Memory Usage     :  931 bytes   90,9 % Full
  Done executing task "RunOutputFileVerifyTask".
Done building target "CoreBuild" in project "StandAL_SID.cproj".
Target "PostBuildEvent" skipped, due to false condition; 
('$(PostBuildEvent)' != '') was evaluated as ('' != '').
Target "Build" in file "C:\Program Files (x86)\Atmel\Atmel Studio 
6.0\Vs\Avr.common.targets" from project "C:\Users\jojo1\Documents\Atmel 
Studio\StandAL_SID\StandAL_SID\StandAL_SID.cproj" (entry point):
Done building target "Build" in project "StandAL_SID.cproj".
Done building project "StandAL_SID.cproj".

Build succeeded.
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped 
==========

von chris (Gast)


Lesenswert?

>        Program Memory Usage   :  3302 bytes   40,3 % Full

Es sieht so aus, als wenn nur das Programm kompiliert wird, aber das 
sound[] array nicht. Ich nehme an, Du hast die große sound Datei, das 
sollte insgesammt so etwa 15Kbyte geben.
Suche mal im Project nach sound[]. Vermutlich ist es irgenwo anders 
definiert und die richtige sound[] wird nicht includiert.

von chris (Gast)


Lesenswert?

>Ich denke es liegt an der Sound.C die man für AvrStudio 6 anpassen muss
>da ein Const verlangt wird.

Mit AvrStudio 6 kenne ich mich nicht aus. Irgendwie sieht es so aus, als 
wenn sound.c nicht mitkompiliert und gelinkt wird. Vielleicht musst Du 
in AVRStudio6 die sound.c explizit in das Projekt mit aufnehmen. Frage 
doch mal hier im GCC-Forumsthread bezüglich AvrStudio6 nach. Auf 
AvrStudio4 geht es.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.