Damit meine Übungen mit dem CPLD nicht beim Blink- und Lauflicht enden,
hab ich mal eine Soundausgabe probiert. Bei dieser Version werden
Rechtecksignale für die Tonleiter über 3 Oktaven erzeugt und
hintereinander abgespielt. Je Note sind ca. 0,5 Sek. als Tondauer fix
vorgegeben.
Ich bin kein Musiker und es mag sein, dass das Ganze noch fehlerbehaftet
ist. Auch meine VHDL ist sicher noch verbesserungswürdig, was ich aber
als Newbie derzeit nicht erkennen kann.
Die Tonfrequenz einer Note steigt stets um den Faktor 2 in der nächst
höheren Oktave. In der mittleren Oktave hat der "Kammerton A" 440Hz. Ich
habe jedoch alle Frequenzen für 3 Oktaven fest vorgegeben, da ein
Versuch mit der Multiplikation inkl. der erforderlichen Abfragen die
Kapazität meines XC95144XL sprengte. Hier spitzen sicher die Profis die
"Ohren" und denken an Optimierung. Für mich ein Wort, von dem ich bei
CPLDs aber noch keine Ahnung habe. Daher wurde stattdessen erfolgreich
versucht, alle Tonfrequenzen für 3 Oktaven fest vorzugeben.
Die Frequenzen hab ich mal in einer Exceldatei beigelegt, falls jemand
an die Nutzung für eine Türglocke oder so denkt.
Wie gesagt, ich bin kein Musiker, aber mir fällt auf, dass die
Frequenzen für die Noten #E und F (sicher ist die Bezeichnung auch
falsch?) identisch sind und dasselbe gilt für die Noten #B und C von der
nächst höheren Oktave. K. A. ob ich falsche Frequenzwerte habe oder ob
das so richtig ist. Letzteres (#B und C) hab ich in meinen Definitionen
drin gelassen, weshalb man diesen Ton doppelt so lang hört wie die
übrigen. Ersteres (#E und F) hab ich erst gar nicht definiert.
Natürlich könnte man das Ganze noch weiter aufbohren, um Melodien
korrekter abspielen zu lassen. Hierzu müssten Ton- und Pausendauer
definierbar sein, was aber mehr Ressourcen erfordert. Bin gespannt, ob
jemand von Euch Lust hat, diesen Faden weiter zu spinnen. ;-)
Hier mal bekannte Noten ;-)
g e e - f d d - c d e f g g g - g e e - f d d - c e g g c c - - d d d d
d e f - e e e e e f g - g e e - f d d - c e g g c c c c
Geht leider derzeit nicht, da Pausen fehlen und z. B. ee als ein Ton mit
doppelter Länge ohne Pause dazwischen ausgegeben wird. Man könnte als
Pause eine unhörbare Frequenz ausgeben lassen, die jedoch aber auch ohne
entsprechende Vorkehrung ca. 0,5 Sekunden mit meinem Code dauern wird.
Bei Bedarf lade ich noch eine kleine Elektronikschaltung für die Ausgabe
über einen Lautsprecher hoch.
1MHz für die Tonerzeugung und 12MHz für die Tondauer wurden verwendet.
Karl-Heinz M. schrieb:> Hier mal bekannte Noten ;-)
"Hänschen klein", na gut... ;-)
Bei dem Lied könntest du aber (weil nur Viertel vorkommen) die Pausen
als "Note" abarbeiten...
> da ein Versuch mit der Multiplikation inkl. der erforderlichen Abfragen> die Kapazität meines XC95144XL sprengte.
Ja klar, denn da könntest du auch mit einer Tabelle was machen, aber für
die nötige Genauigkeit bist du da bald an der Grenze.
> Hier spitzen sicher die Profis die "Ohren" und denken an Optimierung.
Ich denke an ein kleines "FPGA" z.B. Lattice MachXO oder Spartan3AN
Karl-Heinz M. schrieb:> Wie gesagt, ich bin kein Musiker, aber mir fällt auf, dass die> Frequenzen für die Noten #E und F (sicher ist die Bezeichnung auch> falsch?) identisch sind und dasselbe gilt für die Noten #B und C von der> nächst höheren Oktave. K. A. ob ich falsche Frequenzwerte habe oder ob> das so richtig ist. Letzteres (#B und C) hab ich in meinen Definitionen> drin gelassen, weshalb man diesen Ton doppelt so lang hört wie die> übrigen. Ersteres (#E und F) hab ich erst gar nicht definiert.
Das kommt daher, dass Du in der Tonleiter nicht nur ganze, sondern auch
Halbtonschritte hast. In der C-Dur Tonleiter (was Du als Basis nimmst)
liegen diese zwischen E und F, resp. H (amerikanisch B) und C. Das H#
ist also auch das C, und das E# das F. Sieht man sehr schön beim
Klavier, da fehlt an diesen Stellen die schwarze Taste.
IF(stop_sound='1')THEN-- wenn die Tondauer erreicht wurde
2
stop_sound<='0';-- Tondauer kann wieder starten
3
counter1<=0;-- stoppe aktuelle Frequenzausgabe
4
ENDIF;
Diese Abfrage findet in einem Prozess aber ohne Taktabfrage statt.
Weiterhin hast du zwei Takt-Abfragen in dem Prozess. Du solltest dir
nochmals anschauen, wie man getaktete Prozesse richtig beschreibt.
DuArte
DuArte schrieb:> Diese Abfrage findet in einem Prozess aber ohne Taktabfrage statt.> Weiterhin hast du zwei Takt-Abfragen in dem Prozess. Du solltest dir> nochmals anschauen, wie man getaktete Prozesse richtig beschreibt.
Danke, ändere ich, muss ich mir noch ansehen, aber: Ich brauche 2
Zeiten:
Takt 1 zum Zählen der Frequenz und parallel dazu
Takt 2 zum Zählen der Tondauer. Ich wüsste nicht, wie ich beide Zeiten
mit nur einem Zähler machen sollte. Lass bitte mal sehn ;-)
Ich hatte zuerst auch 2 Prozesse dafür, konnte aber den counter oder
einen Schalter nicht im andren Prozess abfragen. Ist mir jetzt schon
klar, warum das nicht geht.
DuArte schrieb:> Diese Abfrage findet in einem Prozess aber ohne Taktabfrage statt.> Weiterhin hast du zwei Takt-Abfragen in dem Prozess. Du solltest dir> nochmals anschauen, wie man getaktete Prozesse richtig beschreibt.
Ich hab Änderungen vorgenommen und hoffe, es passt jetzt so. Sonst bitte
einen Hinweis, wo ich eingreifen kann oder mich schlau machen kann,
danke.
Gefundene Fehler sind korrigiert.
Die lange Pause nach dem Abspielen aller Noten ist jetzt weg, er startet
sofort neu.
Die doppelten Notenfrequenzen sind auch raus.
Die Tondauer musste ich auf ca. 0,35 Sek. reduzieren, sonst passte das
nicht mehr in meinen CPLD. Leider habe ich keinen weiteren
Quarzoszillator mit 1MHz, sonst könnte ich die Ressourcen reduzieren. Er
braucht für die Zählung bis auf 4194303 (0,35 Sek.) bei 12MHz 22 bits.
Bei einem Quarzoszillator mit 1MHz würde hierfür weniger verbraucht
werden.
Karl-Heinz M. schrieb:> Bei einem Quarzoszillator mit 1MHz würde hierfür weniger verbraucht> werden.
Das war das erste, was ich an meinem CPLD-Testboard modifiziert habe:
statt einer festen Taktfrequenz einen variablen Taktgeber ;-)
Duke
Duke Scarring schrieb:> Das war das erste, was ich an meinem CPLD-Testboard modifiziert habe:> statt einer festen Taktfrequenz einen variablen Taktgeber ;-)
Per Poti, Drehko oder wie? Hast mal ein Schaltbild dafür?
Wie stabil ist die Frequenz? Driftet ordentlich?
Karl-Heinz M. schrieb:> Per Poti, Drehko oder wie? Hast mal ein Schaltbild dafür?> Wie stabil ist die Frequenz? Driftet ordentlich?
Per Poti. Die XAPP078 (die Xilinx gar nicht mehr kennen will :-/ )
verwendet einen TLC555. Ich hab einen NE555 dafür verwendet. Die
Stabilität und die Drift hab ich nicht gemessen. Aber der duty-cycle
veschiebt sich bei hohen Frequenzen.
Für Lauflicht u.ä. Lernspielereien reicht es :-)
Duke
danke und den Poti hast Du selbst rein gebatselt? Der ist nicht im
Schaltbild.
Ok, für unsere Übungen reicht so etwas völlig, da braucht es keinen
Quarzoszillator, denke und hoffe ich ;-)
Karl-Heinz M. schrieb:> Duke Scarring schrieb:>> Das war das erste, was ich an meinem CPLD-Testboard modifiziert habe:>> statt einer festen Taktfrequenz einen variablen Taktgeber ;-)>> Per Poti, Drehko oder wie? Hast mal ein Schaltbild dafür?> Wie stabil ist die Frequenz? Driftet ordentlich?
In diesem Zusammenhang eventuell interessant:
Beitrag "Re: Einstellbarer Taktgeber bis 20Mhz ?"
aubergine mit usb-anschluss schrieb:> In diesem Zusammenhang eventuell interessant
Interessant schon, aber ich hätte Angst Luft zu holen. Bestimmt hätte
ich das Teil bald als Fremdkörper zwischen den Zähnen ;-)
Sorry, nix für mich, kaum wahrnehmbar, geschweige denn das Löten...
Vielleicht, wenn ich meinem Uhrmacher das Löten beibringe, kann der es
;-)
Du kannst mit einem PLD einen einfachen Rechteckgenerator bilden, um die
OSCs zu formen. Du brauchts nur die 12 Töne = 12 toggle Register und
davon die jeweiligen Hälften pro Oktave.
Deren Ausgänge alle auf IIR-Filter, um Sinüsse zu gewinnen. Dann wie bei
der IFFT amplituden- und phasenrichtig zusammenmischen und matrixartig
in Kanäle stopfen.
Für die Tongeneration würde ich mir was anderes überlegen:
Ein Tableau wo Notenlängen und -höhen dynamisch gesetzt werden und in
eine ADSR-pipeline gegeben werden.
Dann sind die Notenzahlen von der Zahl der Tongeneratoren unabhängig.
Jaromir schrieb:> Deren Ausgänge alle auf IIR-Filter, um Sinüsse zu gewinnen. ...> Ein Tableau wo Notenlängen und -höhen dynamisch gesetzt werden> und in eine ADSR-pipeline
Wieviele Flipflops haben denn deine CPLDs?
Karl-Heinz M. schrieb:> Wie gesagt, ich bin kein Musiker, aber mir fällt auf, dass die> Frequenzen für die Noten #E und F
Ja, in der Tat ist das derselbe Ton. Es gibt nämlich kein #E :-)
BSDler schrieb:> Karl-Heinz M. schrieb:>> Wie gesagt, ich bin kein Musiker, aber mir fällt auf, dass die>> Frequenzen für die Noten #E und F>> Ja, in der Tat ist das derselbe Ton. Es gibt nämlich kein #E :-)
In C-Dur beispielsweise nicht. Aber es gibt Tonarten, da existiert er,
hört sich aber genau so an wie F in C-Dur.
http://de.wikipedia.org/wiki/Versetzungszeichen
Simon K. schrieb:> In C-Dur beispielsweise nicht. Aber es gibt Tonarten, da existiert er,> hört sich aber genau so an wie F in C-Dur.
Das "E-is" wie es korrekt heisst, gehört zu einer anderen Tonart, als
das "F" und klingt nur in der chromatischen Stimmung gleich, d.h. es hat
dieelbe Grundfrequenz. In der reinen Stimmung ist das z.B. nicht der
Fall. In B-dur hätte der Ton F z.B. über 699Hz, statt 698,5, wenn ich
richtig rechne.
> Ja, in der Tat ist das derselbe Ton. Es gibt nämlich kein #E :-)
Doch, gibt es, nennt sich dann "eis" und ist das Selbe wie ein "f"
(Stichwort: enharmonische Verwechslung)
Jürgen S. schrieb:> Simon K. schrieb:>> In C-Dur beispielsweise nicht. Aber es gibt Tonarten, da existiert er,>> hört sich aber genau so an wie F in C-Dur.>> Das "E-is" wie es korrekt heisst, gehört zu einer anderen Tonart, als> das "F" und klingt nur in der chromatischen Stimmung gleich, d.h. es hat> dieelbe Grundfrequenz. In der reinen Stimmung ist das z.B. nicht der> Fall. In B-dur hätte der Ton F z.B. über 699Hz, statt 698,5, wenn ich> richtig rechne.
Ah, so wars, Danke! Ist schon länger her bei mir mit der Musiktheorie.
Also ehrlich gesagt, denke ich nicht, dass es einen Unterschied macht,
ob ein Synthesizer ein halbes Herz höher tönt oder tiefer und ob das
überhaupt jemand hört.
Manfred Zielke schrieb:> Also ehrlich gesagt, denke ich nicht, dass es einen Unterschied macht,> ob ein Synthesizer ein halbes Herz höher tönt oder tiefer und ob das> überhaupt jemand hört.
Bei 40Hz schon... ;-)
Oder andersrum: wenn 2 Töne raus- und zusammenkommen, der eine mit 699Hz
und der andere mit 698.5Hz, dann hört man das leicht an der dabei
entstehenden Schwebung.
Lothar Miller schrieb:> Oder andersrum: wenn 2 Töne raus- und zusammenkommen, der eine mit 699Hz> und der andere mit 698.5Hz,´
Ich glaube, es ging darum, ob man hören kann, dass der Ton als solcher
ein halbes Herz geringer ausfällt, nicht im Vergleich. Absolut wird man
das sicher nicht hören.
T.G. schrieb:> Absolut wird man> das sicher nicht hören.
Ich bin nicht sicher, aber ich könnte mir vorstellen, dass es Spezies
wie Klavierstimmer etc. gibt, die das vermutlich raushören. Wie sollten
die sonst ihren Job machen? Genauso, wie es feine (Parfumerie-)Nasen
gibt, gibt es in der Musik sicher feine, geschulte Ohren.
@ Karl-Heinz M. (Firma: www.khmweb.de) (khmweb)
>> Absolut wird man>> das sicher nicht hören.>Ich bin nicht sicher, aber ich könnte mir vorstellen, dass es Spezies>wie Klavierstimmer etc. gibt, die das vermutlich raushören. Wie sollten>die sonst ihren Job machen?
Eben durch den Vergleich Der Töne und der daraus entstehenden Dissonanz.
http://de.wikipedia.org/wiki/Dissonanz
Bin aber auch nicht vom Fach, alles nur Vermutung ;-)
Ja, in der Tat: Gute Musiker können das wirklich hören und nicht wenige
sogar absolut! Erfahrungsgemäss werden von Einigen schon rund 20Cent
absolute Notenabweichung als falsch erkannt. Das wären bei den erwähnten
40Hz sogar etwas weniger, als die 0,5Hz. Relativ zu anderen Noten oder
im AB-Vergleich geht es noch viel genauer.
Im direkten Gleichklang mit anderen Noten kann Tonhöhenvaration
eigentlich jeder hören: Man nehme eine kleine Terz: Die Töne liegen zwar
zwar rund 25% auseinander, die Interferenz produziert aber eine
tieffrequente Schwebung, die um so ausgeprägter ist, je präziser die
Frequenzen gehalten werden. Bei Synthesizern und anderen elektronischen
Tongeneratren werden diese meist sehr stur gehalten, während bei
akustischen Instrumenten mehr Dynamik drin steckt. Daher kommt es hier
zu stark wechselnden Schwebungslautstärken, deren Frequenz sofort eine
deutlich andere ist, wenn die Töne minimal abweichen.
Das ist ja gerade der Effekt der reinen Stimmung und zugleich das
Problem bei elektronischer Musik, denn bei bei mathematisch idealen
Verhältnissen gibt der jeweilige Startzeitpunkt eine zufällige
Phasenlage vor, mit der die Interferenz dann agiert. Ein "guter"
Synthesizer muss daher die Frequenzen eines Akkords unabhängig
voneinander modulieren, sonst klingt es steril. Leider sind die
Modulatoren selber meist wiederum sterile LFOs und damit auch wieder
mathematisch korrelliert. Für dieses Problem gibt es durchaus Lösungen,
die allerdings ein tiefergehendes Verständnis der Vorgänge von sich
beeinflussenden Schwingungen in Instrumenten erfordert (samt einiger
kluger Ideen, wie man diese geschickt modelliert) und die auch nicht
mehr in ein PLD passen:-)
Bei der PLD-Version von Karl-Heinz dürfte das so sein, dass die Töne
infolge der Rundung der Inkremente nicht korrekt sind und weder
chromatisch noch rein schwingen, sondern in einer festen Relation
schweben, die einen stärker, die anderen schwächer.
Ein Tipp: Egal, ob gerundete Festfrequenz oder DDS mit erhöhter
Auflösung, es gibt entweder statische Schwebungen oder die Phasensprünge
mit dynamischen wechselnden Schwebungen. Der erste und einfachste
Lösungsansatz ist, die entstehenden Töne minimal i der Tonhöhe zu
modulieren un zudem die Wellen mit einem IIR zu filtern. Dadurch wandeln
sich die Phasensprünge in eine Mischung aus Phasen- und
Amplitudenbewegung um, die viel unauffälliger klingt.
@Karl-Heinz: Warum hast Du denn in Deiner TF-Tabelle das #B und andere
Indentitäten nochmals aufgeführt? Bei der Chromatischen Stimmung sind
das doch dieselben Töne.
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang