Arduino Töne berechnen

Hallo zusammen,
ist hier zufällig ein begnadeter Mathematiker?

Ich habe dieses Samplegefunden, funktioniert auch super.
Wer kann die nächsten Töne (D, E, F, G usw.) berechnen?

Ich verwende die Töne als Quittungstöne für eine RFID Kasse. C als OK geht gerade noch so, aber als ERROR - Ton ist das zu tief.

Ich hätte da gerne einen Ton über 1000 Hz.

Gruß
Fred

Die Formel steht doch oben über der Tabelle. Trage dort z.B. 1046 für die Frequnz ein, und Du hast den Ton C eine Oktave höher.
Und wenn ich das richtig verstehe, geht es doch noch nichtmal um musikalisch korrekte Töne. Dann kannst Du jede für dich passende Frequenz da eintragen.

Hi

Laut den Werten im Link stimmt Das, was ich jetzt ablasse, nicht:
Irgendwo las ich Mal, daß durch Verdoppeln der Frequenz die Note eine Oktave höher erreicht wird.
Bei dem Beispiel passt Das aber 'nicht ganz' - von 'C' 956 auf 'c' käme 'ich' nur auf 1912, dort stehen aber 1915.

Das war's dann aber auch schon wieder, was ich mit Musik am Hut habe :slight_smile:

MfG

Irgendwo las ich Mal, dass durch Verdoppeln der Frequenz die Note eine Oktave höher erreicht wird.

Das ist richtig.

Ich brauche aber nicht die Frequenz sondern "period" und der Wert fällt mit steigender Frequenz
c = 3830
C = 1912
f = 2864
F = ????

Die genaue Tonhöhe, wie auf einem Klavier, ist da eigentlich egal.

Ahhhh, genau:

3830 ist in etwa das Doppelte von 1912 (c zu C).
Gleich mal ausprobieren, ob F dann 1432 im Vergleich zu f) ist.

Manchmal sieht man den Wald vor lauter Bäumen nicht.

Oh mann, wo war ich damals nur in der Schule? Bestimmt krank :slight_smile:

f = 1 / t

Deshalb sinkt die Zeit am Output-Pin mit steigender Frequenz.

Ich gebe alle meine Zeugnisse von der Penne (ABI 1982) zurück.

freddy64:
f = 1 / t

Genau so steht's in der Formel in deinem Link drin :wink:

postmaster-ino:
Irgendwo las ich Mal, daß durch Verdoppeln der Frequenz die Note eine Oktave höher erreicht wird.
Bei dem Beispiel passt Das aber 'nicht ganz' - von 'C' 956 auf 'c' käme 'ich' nur auf 1912, dort stehen aber 1915.

Im Prinzip ist das mit der Oktave so. Musik ist aber keine 'reine' Mathematik. Deshalb klingt sie viel lebendiger, wenn es eben nicht 'genau' stimmt. Und deshalb sollte eine Oktave eben nicht mathematisch genau das doppelte sein.
( Bei den ersten elektronischen Orgeln mit digitalen Frequenzteilern war das noch so, weshalb die sehr 'steril' klangen )

Woran hat sich dann aber z.B. der Silbermann mit seinen Orgeln orientiert?
Irgendwie muss es doch schon zu der Zeit eine Formel für die Töne gegeben haben.
Analog klingt immer besser als digital, warum auch immer.
Deshalb höre ich auch heute wieder Schallplatten statt MP3, ohne digitale Klangbeeinflussung durch irgendwelche DSP's. Der Sound ist einfach abartig geil. :slight_smile:

freddy64:
Woran hat sich dann aber z.B. der Silbermann mit seinen Orgeln orientiert?

An seinen guten Ohren :slight_smile: . Ein Klavierstimmer stimmt ja auch nicht mit dem Frequenzzähler, sondern nach seinem geschulten Gehör. Für den Kammerton A gibt es eine Referenz ( die Stimmgabel ), und ab da gilt dann das geschulte Gehör. Das ist nie mathematisch exakt, aber deshalb ja auch so gut 8)

Elektronische Instrumente arbeiten rein mathematisch. Basis ist z.B. der Kammerton A mit 440 Hz. Oktaven sind - wie bereits erwähnt - die doppelte bzw. halbe Frequenz. Der Abstand der Frequenz von benachbarten Halbtönen beträgt genau den Faktor 12. Wurzel aus 2, so dass man nach 12 Halbtonschritten eben genau bei der Hälfte bzw. dem Doppelten angekommen ist.

Also z.B.

A = 440 Hz, dann ist B = 440 Hz * 1,059463094359295 = 466 Hz (gerundet)
B = 466 Hz, dann ist H = 466 Hz * 1,059463094359295 = 494 Hz ... usw.

Die Oktaven wurden in elektronischen Instrumenten gerne per Frequenzteiler (D-Flipflop) aus entsprechend hohen Tongeneratoren abgeleitet. Heute macht man das in Software (DSP).

Ich habe jetzt rein mathematisch die Tonhöhen berechnet, bis ich auf diese 2 Töne gekommen bin:

#define C2 1912 // 523 Hz
#define D2 1700 // 587 Hz
#define E2 1516
#define F2 1432
#define G2 1275
#define A2 1136
#define B2 1014
#define C3 956
#define D3 850
#define E3 758
#define F3 716
#define G3 637
#define A3 668
#define B3 507
#define C3 478

uint16_t melody_ok[] = { B2 };
uint8_t beats_ok[] = { 16 };

uint16_t melody_err[] = { B3, B3, B3 };
uint8_t beats_err[] = { 8, 8, 8};

Damit kann ich einen OK-Ton bzw. ein Error beep,beep, beep mit einem 8Ohm / 0.5 W Lautsprecher direkt an den GPIO's erzeugen.

Jetzt noch zum Thema Lautstärke:
Der ESP32 arbeitet nur mit 3.3V. Wie kann ich mit 1 Transistor und 1-2 Widerständen die Lautstärke erhöhen. Ohne Gehäuse würde die Lautstärke ausreichen, aber sobald alles im Gehäuse verstaut ist, reicht die Lautstärke nicht mehr aus.
Hat da jemand von euch eine kleine Skizze parat?

Nur mit Transistoren und Widerständen wirds nix. Du brauchst noch eine (höhere) Spannung.
Dann bietet sich aber gleich ein fertiger Treiberbaustein an:
UILN2803 besitzt gleich mehrere OK Treiberstufen. Lautsprecher zwischen Ausgang des Treibers und der Versorgungsspannung und den entsprechenden Eingang an den ESP.
Das wird dann laut genug....

Die Spannungsversorgung erfolgt über USB. An Vin liegen doch dann ~5V an.
Reicht das nicht schon mit ein paar extra Bauteilen für eine höhere Lautstärke?

5V an 8 Ohm ergibt ca 0,600A

Das müsste deine Treiberstufe für maximale Lautstärke an 5V bringen.
Ein nackter AVR Pin bricht bei ca 0,020A schon merkbar ein.
Über 0,040A kommt kaum noch Spannung raus.

USB2 ist mit 0,600A auch schon gut gefordert.
Üblicher weise, ohne Sonderabhandlung, sind 0,100A das Ende der Fahnenstange.

Mache dich kundig:
Klasse A Endstufe
Klasse B Gegentaktendstufe

Über "Klangqualität", müssen wir hier nicht reden.
Oder?

So weit ich mich noch erinnern kann, berechnet man die Leistung einer Endstufe:
Sinus-Ausgangsspannung² / Lautsprecherwiderstand.
Da müssten doch mit 5V Vcc locker 0.5W an 8 Ohm über einen oder 2 Transistor(en) erreichbar sein.
Es geht hier nicht um Qualität. Der Beep muss nur lauter werden, als direkt vom GPIO.
Ich bin in der NF-Schaltungstechnik nicht so bewandert.
Vom GPIO über einen ELKO auf die Basis eines Transistors, einen Widerstand für die Gegenkopplung vom Kollektor zurück auf die Basis. Den Kollektor an +Vcc und den Lautsprecher in die Emitterleitung des Transistors gegen GND.
ABER: was für einen Transistor und welchen Widerstand, damit der µC nicht abraucht?

Schau mal hier ( https://forum.arduino.cc/index.php/topic,22678.0.html )

Ein kleiner, fertiger Verstärker ähnlich diesem hier tut es doch auch.

Ich bleib bei meinem Vorschlag mit dem ULN2803....

Und ich bei meinem Vorschlag: Klasse B Gegentaktendstufe

Bei mir ist's 1 Bauteil, ggf. mit 8 Kanälen....
https://www.reichelt.de/eight-darlington-arrays-dil-18-uln-2803a-p22085.html?&trstct=pos_0
0.35 €