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.
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
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
Shit, ich bin 86 geboren :). Trotzdem danke, werd ichs halt ueber nen d/a wandler versuchen. mfG
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
Und wie geht das mit den 8bit? Wäre polyphone (annährend) auch möglich?
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 :)
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.
>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.
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
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.
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.
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.
Deiner Theorie nach, kannst du garnicht mehrere Töne gleichzeitig spielen, da daraus dann nur ein einzelner Ton wird...
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?
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,
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
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...
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...
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.
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.
> 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.
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.
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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.