Forum: Projekte & Code Melodie ausgeben mit AVR


von Peter Brasholz (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe eine Melodieausgabe für einen AVR (ATTiny12) gemacht. Benötigt
nur einen Pin und kann vielleicht innerhalb eines grösseren Projekts
benutzt werden. Sowas gibts wahrscheinlich schon tausend Mal, aber
vielleicht kanns doch einer brauchen.

von andré (Gast)


Lesenswert?

Hm, reicht das ueber den Timer eigentlich fuer ne Sprachansage oder
wuerde man da kein Wort verstehen? Evtl hat das ja schonmal wer
getestet :).

mfG

von Hugo (Gast)


Lesenswert?

Hi,

wenn Du 1Bit PCM Sound meinst - vergiss es! Habe es ausprobiert und es
klingt fast noch schlechter als die Sprachausgabe vom C64 !!! (So um
1985).

Grüße

von andré (Gast)


Lesenswert?

Shit, ich bin 86 geboren :). Trotzdem danke, werd ichs halt ueber nen
d/a wandler versuchen.

mfG

von BlueLoop (Gast)


Lesenswert?

warum soll 1Bit PCM schlecht klingen? Du musst nur entsprechend schnell
ausgeben. Der ATMEL ist ja schnell genug dafür, nur einen ATTINY sollt
man wegen des etwas kleinen Speichers nicht nehmen.

Mit PWM und 256fachem oversampling (8Bit PWM/ 4kHz / 1 MHz) hört sich
das schon ganz gut an.

Gruß Alex

von Marco (Gast)


Lesenswert?

Und wie geht das mit den 8bit?
Wäre polyphone (annährend) auch möglich?

von Marius S. (lupin) Benutzerseite


Lesenswert?

das würde mich auch interessieren... kann ich per PWM irgendwie 8 bit
raw audio daten abspielen? Die qualität ist fast egal... würde mich nur
interessieren ob das an sich gehen würde :)

von Benedikt (Gast)


Lesenswert?

Natürlich geht das, das machen die meisten CD Player genauso (nur nicht
ganz mit PWM, sondern mit PDM)
Schreibt doch einfach mal ein programm, das Daten per UART empfängt,
und als PWM Wert ausgibt.
Bei 115200Baud kann man 11kHz 8bit Mono Wave Dateien direkt mit einem
Terminalprogramm senden/abspielen.

von Marius S. (lupin) Benutzerseite


Lesenswert?

das werde ich definitiv mal ausprobieren! :)

von Seppl (Gast)


Lesenswert?

>Schreibt doch einfach mal ein programm, das Daten per UART empfängt,
und als PWM Wert ausgibt.

Unter polyphone verstehe ich, das mehrere Töne gleichzeitig abgespielt
werden. Wie soll ich das erreichen?

Und einfach ist immer relativ. Wenn alles einfach wäre, gäbe es keine
Internetforen in denen man Fragen stellt.

von Benedikt (Gast)


Lesenswert?

Mehrere Töne gleichzeitig: Audiosignale mischen (Mittelwert bilden)

von Blueloop (Gast)


Lesenswert?

du machst dir z.b eine kleine sinustabelle mit 64 Einträgen.
Für jede Stimme brauchst du eine Variable "Tonhöhe" und ein Variable
mit der aktuellen Position in der Tabelle. Wobei die Tonhöhe nicht
direkt die Tonhöhe darstellt sondern die Sprungweite in der
Sìnustabelle um den entsprechenden Ton zu erhalten.

Beispiel 4fach polyphon:

wert = 0
for i=0 to 3 do
   wert += sintab[stimme[i].position / 16];
   stimme[i].position += stimme[i].tonhoehe;
   if (stimme[i].position > 64) stimme[i].position -= 64;
pwmausgabe(wert);

diese Routine muss jetzt im Interrupt zb. 11000 x sec. aufgerufen
werden. Der tiefste Ton ist dann 10Hz, der höchste 5500Hz.

Gruß Alex

von Seppl (Gast)


Lesenswert?

Mittelwert?
Wenn ich ein Schlagzeug mit 100Hz habe und ein Klavir mit 3900Hz und
beides addiere und durch die Summe der Zahlen teile komme ich auf 2kHz.
Aber 2kHz sind ja nicht 100Hz und 3900Hz.

von Benedikt (Gast)


Lesenswert?

Aus dem Grund spielen in einem Orchester Schlagzeug und Klavier selten
zusammen... ;-)

Nein, im ernst: Wenn du die ganzen Sampelwerte einzeln so
zusammenrechnest, bleiben beide Signale erhalten, sie werden nur
überlagert.

von Seppl (Gast)


Lesenswert?

Wenn ich auf dem Keyboard ein Akkord spiele, sind das idr 3 oder 4 Noten
gleichzeitig. Das hört sich harmonisch an.
Wenn ich aber anstelle von C-Dur nur das E spiele, fehlt das was. Zwei
Noten um genau zu sein ;)
Es ist dann nicht mehr das gleiche.

Es mag ja stimmen, das es so geht. Aber wenn ich das auf dem Keyboard
nachspiele. hört es sich nicht mehr so an, wie ich es haben wollte. Und
das reicht für mich um es nicht zu glauben/verstehen.

von Benedikt (Gast)


Lesenswert?

Deiner Theorie nach, kannst du garnicht mehrere Töne gleichzeitig
spielen, da daraus dann nur ein einzelner Ton wird...

von Seppl (Gast)


Lesenswert?

Meiner Theorie nach geht es.

Das was ich aufgezeigt habe ist die Theorie des Mittelwerts.

Das es geht höre ich jeden Tag wenn ich das Radio an mache.
Das es geht höre ich auch, wenn ich die Tasten am Keyboard drücke.

Das Problem, wie geht es???

Das mit der Sinustabelle habe ich nicht so wirklich verstanden.
Aber viele Wege führen ja nach Rom, wo ist der zweite?

von Benedikt (Gast)


Lesenswert?

Ich erklärs mal analog:
Hörst du Radio und es fährt ein Auto vorbei hörst du beides, da sich
beide Schallwellen (Luftdruckwerte) addieren.

Um jetzt zwei Töne digital zusammenzubauen, addiert man beide Werte und
teilt diese oftmals durch zwei, damit diese wieder in ein Byte passen,
also genau dasselbe wie es von selbst im analogen Bereich passiert,

von Seppl (Gast)


Lesenswert?

Sorry, es ist echt nicht so, das ich es nicht verstehen will oder das
ichmit aller Gewalt versuche dagegen anzugehen, aber es will mir nicht
in den Kopf :(
Drücke ich auf dem Keyboard C, E, G hört es sich anders an als nur das
Mittel (E). Nur das E klingt in diesem Fall nicht so harmonisch.

Es ist mir auchklar, das ein Lautsprecher nur mit einer Frequenz zur
Zeit schwingen kann. Er kann ja nicht 100 Schwingungen gleichzeitig
wiedergeben.
Einer der Gründe, warum sich 3-Wege besser anhören als alles in einem
;)

Nehmen wir nochmal das Beispiel von vorhin:
2kHz waren da der Mittelwert. :2=1000:2=500:2=250
Und 250 passt in ein Byte. Oder war das anders gemeint?
Was mache ich jetzt mit diesem Wert?

Mit Bascom ist es ja relativ einfach. Beim Befehl Sound gebe ich die
Frequenz an, die gespielt werden soll. Oder ich toggle einen Pin und
warte immer gewisse Zeiten und habe dann eine Frequenz. Aber was mit
den 250 anstellen? Und wenn diese Rechnung im Ansatz richtig ist, habe
ich ja immer so kleine Werte. Hohe Frequenzen sind dann nicht möglich?

Ich will damit auch keine Konzerte ersetzen! Aber ein kleines
Soundmodul mit nicht nur piepsigen Tönen z.B. als Türklingel wäre in
meinen Augen ein Einsatzgebiet. Es soll auch keine "Realsound"
abspielen können. Dafür sind andere ICs besser geeignet. 4 Töne
gleichzeitig und so viele Noten bis der Speicher voll ist wäre schon
ganz nett.

Ich bedanke michan dieser Stelle schonmal an alle, die geduldig
geblieben sind und weiterhin versuchen möchten mich aufzuklären.
Und nochmal an die, die ein Bascom-Sample hätten :D

von Läubi (Gast)


Lesenswert?

Schau dir doch mal z.B: ein Wavefile im Soundeditor von windows
(sndrec32.exe) an.
Dann wirst du sehn... verschieden hohe "wellen" ...
und trozdem hörst du doch richtige Musik...

von Seppl (Gast)


Lesenswert?

Wie so ein Wavefile am Monitor aussieht weis ich. Aber wie sage ich das
dem AVR???

von Benedikt (Gast)


Lesenswert?

Dem AVR ist das komplett egal.
Er muss nur die Daten ausgeben, die dann mittels PWM und Tiefpass in
ein analoges Signal umgewandelt wird. Und das ist dann dasselbe wie es
auch aus der Soundkarte raus kommt.

Und die kann auch meherere Töne gleichzeitig abspielen...

von Läubi (Gast)


Lesenswert?

Also verwechselt wird das hier wohl mot den "Polyhonen
Klingeltönen"... bzw Polywhones MIDI.
Hirbei braucht man einen MIDI Chip der mehrere Töne (Polphon)
Synstetisiert udn zu einem gemeinsammen Signal mischt.
Da ein Midi halt kein Digitales Signal ist sondern eine
"Toninformation" ähnlich einem Notenblatt muß man erstmal diese Noten
mit einem MIDI Synthesizerchip in ein WAV wandeln.
In wirklichkeit werden natürelich nicht mehrere Töne gespielt, wie soll
das gehen, dan müßtest du ja irsinnig viele Lautsprecher haben. Anstelle
dessen wird genau das gemacht was du machen willst, die Töne werden
gemischt sodass es sich anhört als würden beide Töne gelichzeitig
klingen.

von tsetse (Gast)


Lesenswert?

zuerst muss man unterscheiden,ob an dem Pin ein Digital-Ton
(Rechteck)oder ein Sinus ausgegeben wird (z.B. über PWM oder DAC).

Wenn man mehrere Sinuswerte zusammenaddiert, klingen sie wie ein
Klang.
Digitalwerte kann man schlecht zusammenaddieren, man könnte sie
bestenfalls noch xor-en. Das kann sich aber schräg anhören, denn das
klingt eher nach Ringmodulator (Multiplikation).

Suche mal hier im Forum nach Tonerzeugung, zwei Töne erzeugen, Sinus
ausgeben... da gibt es genug zu lesen.

von Rolf Magnus (Gast)


Lesenswert?

> Drücke ich auf dem Keyboard C, E, G hört es sich anders an als nur
> das Mittel (E). Nur das E klingt in diesem Fall nicht so
> harmonisch.

Es geht nicht um den Mittelwert der Frequenzen, sondern der einzelnen
Momentanwerte der beiden Schwingungen.

> Es ist mir auchklar, das ein Lautsprecher nur mit einer Frequenz
> zur Zeit schwingen kann.

Soso. Da hast du aber unrecht. Ein Lautsprecher kann einen bestimmten
Frequenzbereich wiedergeben. Wieviele Frequenzen aus diesem Bereich
gleichzeitig, ist ihm egal. Die Schwingungen müssen nur übelagert
werden.

> Einer der Gründe, warum sich 3-Wege besser anhören als alles in
> einem ;)

Nein, der Grund dafür ist, daß ein Lautsprecher immer nur für einen
begrenzten Frequenzbereich einigermaßen gleichmäßig gut funktioniert.
Daher setzt man mehrere verschiedene Lausprecher ein, um den gesamten
hörbaren Bereich möglichst gut abzudecken.
Nach deiner Theorie könnte man auf einem 3-wege-System nur drei Töne
gleichzeitig abspielen.

> Nehmen wir nochmal das Beispiel von vorhin:
> 2kHz waren da der Mittelwert.

Nein. Die Freuenz ist nur die Häufigkeit, mit der sich der Wert ändert,
den du mitteln sollst.

von Seppl (Gast)


Lesenswert?

Es lebe der Webring ;)

http://www.geocities.com/jasen_betts/polyphonic/index.html

Schade das ich kein Assembler kann. Ich werd mir das trotzdem mal in
Ruhe durchlesen und vertiefen.

Danke auch für eine gewisse Belehrung. Sie hat zwar nicht zur Lösung
des Problem beigetragen, aber konnte einige Fakten klarstellen.

von Jürgen Schuhmacher (Gast)


Lesenswert?

Leute ihr seit SPITZE!!!! - Ich hab selten so gelacht wie bei diesem
Thread!!!!  Vom C64 über Wavelab, Tonsynthese und scheinbaren
Differenztoenen ist alles drin :-) Weiter so.

Machen wir es mal kurz:

Musik: Du hast ein Register, das für jeden Ton den Einsatz, die Dauer,
den Kanal, die Lautstärke und die Tonhöhe festlegt. Dieses Register
wird abgearbeitet und die Töne auf die Kanäle verteilt.

Tonsynthese: Eine vorgegebene Tabelle mit beliebiger (nicht unbedingt
sinusförmiger) Wellenform wird von einem "Strahl" abgetastet und der
Sollwert ausgelesen. Dazu braucht es einen zyklischen Programmablauf,
der den jeweiligen Wert ausliest und als Momentanwert speichert. Eine
geringfügig langsamere Frequenz führt später zu einem niedrigeren Ton.

Macht man das parallel zb auch mit einer anderen Tabelle, so bekommt
man mehrere Töne- wohlgemerkt nicht nur sinusförmige! Für vernünftige
Musik benötigt man nur 2-3kHz maximal, den Rest macht man mit den
Oberwellen.

Die ausgelesenen Momentanwerte werden mit der Solllautstärke
multipliziert und auf ein Summenregister gespeichert. Dies muss bei
jeder Änderung eines jeden der oberen Tonaugangsregister geschehen.

Das Problem ist aber, daß die Einschreibeschleifen der Tonerzeugung
unabhängig und sehr feinstufig laufen müssen, was eine entsprechende
Freuqenz erfordert. Diese muss für Terzabstand in der zweithöchsten
Oktave mindestens 40-50x über der Grenzfrequenz liegen. Beispiel:

Ein Zähler zählt alle 30 Takte weiter, ein anderer alle 20. Damit
tastet der kürzere seine Tabelle 1.5x schneller ab - was in etwa eine
Quinte ergibt. Man kann diese nun minimal verstimmen, wenn man nur 29x
taktet. Schaltet man bei auf die halbe Frequenz (10,15) geht es auch
noch. Noch eine teifere Oktave geht nicht mehr, da man 7,5 nicht
einstellen kann.

Jedenfalls bekommt man so seine unterschiedlichen Tonhöhen, parallel
hin.


Eine Ausleseschleife, die entsprechend rasch läuft, liest ´nun
permanent den Momentanwert im Summenregister und bildet den
Ein-Bitstrom oder schreibt es in den DAC. Auch das muss sehr rasch
gehen. Nach Nyquist reicht etwas mehr als Faktor 2, aber durch den
mangelnden Tiefpass später sind höhere Frequenzen vozuziehen.

Obiges Beispiel aufgegriffen würde ich mit 3khZ rechnen und als
zweithöchste Interferenzfrequenz etwa 2kHz ansetzen. Als Interferenz
findet man also 6MHz. Mit dieser müsste das Summenregister ausgegeben
werden, wenn man alle Änderungen unverzerrt übertragen will. Da dies
weit oberhalb der hörbaren und analog übertragbaren Frequenzen der
Lautsprecher lieg´t, kann man das direkt auf den DAC geben. Da spielt
dann Tiefpass. Nimmt man gewisse Verzerrungen inkauf, so reicht auch
ein 10tel der Frequenz.

von Marius Schmidt (Gast)


Lesenswert?

Benedikt, das haut bei mir gar nicht hin mit UART.

Das ist viel zu langsam. Mit welchem audio editor kann ich eine 11khz
raw datei erstellen? Vielleicht hat das meiner nicht hin bekommen...

von DaZKeiLeR (Gast)


Lesenswert?

Hallo Herr Brasholz,

ich finde ihr Programm "Melodie ausgeben mit AVR" super. Ich habe es auf 
einen ATTiny24A modifiziert und es läuft einwandfrei. Jetzt hätte ich 
noch eine Frage, wie kann ich andere Melodien generieren?

MfG G.M.

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.