mikrocontroller.net

Forum: FPGA, VHDL & Co. Musik aus dem CPLD ;-)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Xyz X. (Firma: xyz) (khmweb)
Datum:
Angehängte Dateien:

Bewertung
3 lesenswert
nicht lesenswert
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.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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

Autor: P. K. (pek)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: DuArte (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
IF (stop_sound = '1') THEN -- wenn die Tondauer erreicht wurde
      stop_sound <= '0'; -- Tondauer kann wieder starten
      counter1 <= 0; -- stoppe aktuelle Frequenzausgabe
END IF;


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

Autor: Xyz X. (Firma: xyz) (khmweb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Xyz X. (Firma: xyz) (khmweb)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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

Autor: Xyz X. (Firma: xyz) (khmweb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Duke Scarring (Gast)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
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

Autor: Xyz X. (Firma: xyz) (khmweb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ;-)

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Duke Scarring schrieb:
> Für Lauflicht u.ä. Lernspielereien reicht es :-)
Und sogar zum Basteln mit der Seriellen Schnitte...  ;-)

Autor: aubergine mit usb-anschluss (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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 ?"

Autor: Xyz X. (Firma: xyz) (khmweb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 
;-)

Autor: Xyz X. (Firma: xyz) (khmweb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Duke Scarring schrieb:
> Die XAPP078 (die Xilinx gar nicht mehr kennen will :-/ )

Ist viell. was für Dich:
http://dangerousprototypes.com/docs/CPLD:_Complex_programmable_logic_devices

Autor: Michael (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Schon gesehen:

96kHz Audio Engine mit FPGAs
http://www.96khz.org/cyclonedspproject.html

Autor: Xyz X. (Firma: xyz) (khmweb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Schon gesehen:

mir gefällt mein CPLD besser ;-))

Ist toll, aber momentan bin ich noch nicht reif für FPGAs.

Autor: Jaromir (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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?

Autor: BSDler (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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 :-)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: ... (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
> 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)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Manfred Zielke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: T.G. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: Xyz X. (Firma: xyz) (khmweb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Falk B. (falk)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
@  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 ;-)

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.