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
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
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
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
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
@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
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.
@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 :-))
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
@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
>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.
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.
@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
> 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
@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
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)
>Der Link zum Programm ATMEAG8SID.zip funktioniert nicht.
Upps, da ist mir beim rumschieben was schief gegangen. Jetzt geht er
aber wieder!
Gruss,
Christoph
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.
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
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
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.
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.
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
>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
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
>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
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
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
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.
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
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.
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?
>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.
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
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
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
@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
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
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
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
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
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
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
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
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
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
@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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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
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
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.
"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
>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?
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.
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
==========
> 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.
>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.