Frequenz mit Frequenz schwanken lassen
Übersicht

KruemelatorBetreff: Frequenz mit Frequenz schwanken lassen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Problem: Frequenz des Tons schwankt nicht gleichmäßig mit einer weiteren Frequenz, sondern steigt allmählich an.
Ich hatte einen Ton mit einer bestimmten Frequenz. Da sich dies langweilig anhört, wollte ich die Frequenz gleichmäßig rauf und runter schwanken lassen. Das wollte ich damit machen: Code: [AUSKLAPPEN] frequenz = ursprungswert * (Sin(schwank-frequenz)+1)/2
ton = laustaerke * Sin(frequenz) Die Frequenz bewegt sich dann zwischen 0 und ihrem Ursprungswert mit der "schwank-frequenz" bei sin() wird etwas anderes eingesetzt als direkt die Frequenz, nämlich: 360.0*(frequenz#/sample_rate) Ich dachte mir das würde funktionieren, aber das tat es nicht. Der Ton schwankte zwar hin und her, aber er wurde immer höher. Ich probierte herum und fand heraus wenn man ein "Int" einsetzt, dass dann zwar nur zwischen 0 und 1 ohne Abstufungen gewechselt wird, es aber sonst funktioniert. Hier nochmal ein Programm was es verbildlicht: Mit Leertaste kann man wechseln. Code: [AUSKLAPPEN] Graphics 800,600,16,2
SetBuffer BackBuffer() ClsColor 255,255,255 Color 0,0,0 fpsrate = CreateTimer(60) While Not KeyHit(1) WaitTimer(fpsrate) Cls bereich = 80 For x1=0 To 6 For x=0 To 798 If KeyDown(57) Then frequenz# = 0.1 wert1a# = Sin((360.0*(frequenz#/bereich))*(x+x1*800)) frequenz# = 2*Float((wert1a#+1)/2) wert2a# = Sin((360.0*(frequenz#/bereich))*(x+x1*800)) frequenz# = 0.1 wert1b# = Sin((360.0*(frequenz#/bereich))*(x+1+x1*800)) frequenz# = 2*Float((wert1b#+1)/2) wert2b# = Sin((360.0*(frequenz#/bereich))*(x+1+x1*800)) Else frequenz# = 0.1 wert1a# = Sin((360.0*(frequenz#/bereich))*(x+x1*800)) frequenz# = 2*Int((wert1a#+1)/2) wert2a# = Sin((360.0*(frequenz#/bereich))*(x+x1*800)) frequenz# = 0.1 wert1b# = Sin((360.0*(frequenz#/bereich))*(x+1+x1*800)) frequenz# = 2*Int((wert1b#+1)/2) wert2b# = Sin((360.0*(frequenz#/bereich))*(x+1+x1*800)) EndIf Line x,50*wert2a#+x1*100,x+1,50*wert2b#+x1*100 Next Next Flip 0 Wend End Gruß Kruemelator |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
[Mathe]Einen Ton kann man als Funktion der Zeit ausdrücken.
Der Funktionswert entspricht der Amplitude. Du brauchst noch eine Variable in der (mathematischen) Funktion: Die Zeit[/Mathe] In normalem Deutsch: Du brauchst die Zeit bzw. den x-Wert beim Zeichnen, um die Frequenz und den Ausschlag zu berechnen. BlitzBasic: [AUSKLAPPEN] Frequenz = Ursprungswert + Sin(Zeit/Samplerate*Schwankfrequenz) * Schwankstärke mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Habe ich, nur vergessen hier zu schreiben.
Zitat: For x=0 To sample_rate*sekunden
frequenz# = 1.0 y# = Sin((360.0*(frequenz#/sample_rate))*x) Next Würde eine Sinus-Ton mit der Frequenz von 1 Hz erstellen. Was außerdem auffällt ist, das der Bereich in dem einmal hin und zurück geschwankt wird, sich verkleinert. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich denke, du musst vor allem darauf achten, dass Du für die SchwankFrequenz, die Original-Frequenz und die resultierende Frequenz wirklich drei verschiedene Variablennamen verwendest.
Sonst kommt es genau zu den von Dir beschriebenen Effekten, dass das Schwanken sich über die Zeit verändert. OriginalFrequenz=400 SchwankungsFrequenz=50 Die resultierende Frequenz soll da ja wohl zwischen 375 und 425 variieren, oder? For i=0 To 359 ResFrequenz=OriginalFrequenz+SchwankungsFrequenz/2*sin(i) Next oder hab ich Dich da falsch verstanden? |
||
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Von Midimaster
Zitat: Die resultierende Frequenz soll da ja wohl zwischen 375 und 425 variieren, oder?
Genau das will ich erreichen. Aber wie müsste das dann aus sehen? Weil wenn man es so macht funktioniert es nicht: Code: [AUSKLAPPEN] spieldauerinsekunden = 4
sample_rate = 44100 OriginalFrequenz# = 400 SchwankungsFrequenz# = 50 Lautstaerke = 3000 For x=0 To sample_rate*spieldauerinsekunden-1 ResFrequenz# = OriginalFrequenz# + 50/2.0 * Sin(360.0 * SchwankungsFrequenz# / sample_rate * x) y# = Lautstaerke * Sin(360.0 * ResFrequenz# / sample_rate * x) Next Dann steigt die resultierende Frequenz wieder an. |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich bin zwar kein Musikexperte, aber zwei überlagerte Frequenzen sind doch einfach die Addition von zwei Sinuskurven mit entsprechender Frequenz, nicht?
Code: [AUSKLAPPEN] Graphics 800, 600, 0, 2
SetBuffer BackBuffer() Local Timer = CreateTimer( 60 ) Local Frequency1# = 720 Local Frequency2# = 2880 Local Amplitude1# = 200 Local Amplitude2# = 50 While Not KeyHit( 1 ) Cls LockBuffer BackBuffer() Local OldY# = 400 For X = 0 To 800 Local Y# = 300 + Sin( X*Frequency1#/360.0 )*Amplitude1# + Sin( X*Frequency2#/360.0 )*Amplitude2# Line X - 1, OldY#, X, Y# OldY# = Y# Next UnlockBuffer BackBuffer() Flip 0 WaitTimer Timer Wend End |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@Noobody:
Ich wollte aber etwas anderes erreichen. Ich wollte einen Ton der höher, dann tiefer, dann höher, dann tiefer usw. ist. Die Tonhöhe sollte also rauf und runter schwanken, und zwar mit der "Schwankfrequenz". |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich habe mir schon gedacht, dass Du das so willst. Das müßte auch ganz leicht zu verwirklichen sein.
Allerdings musst Du mir noch ein paar Deteils deines Codes mitteilen: 1. Die Schwankung: Der Ton pendelt also zwischen zwei Frequenzen hin und her. Warum denkst Du, dass diese Schwankung mit einer weiteren Sinuskurve gemacht werden sollte? Ein lineares Ansteigen auf die eine Frequenz und ein anschließendes Abfallen auf die erste klingt doch viel gleichmäßiger. Bei einer sinus-förmigen Zu/Abnahme bleibt die Frequenz lange oben bwz unten und rennt dann plötzlich von einem zum anderen Wert. 2. zeitlicher Verlauf In welcher Zeit soll die Frequenz einmal hoch und wieder runtergelaufen sein? Hier liegt der Denk-Fehler in deinem Code. Du änderst dort die SchwankFrequenz zu schnell. Ein Ton mit z.B. 400Hz braucht ja erst mal ca. 100 Sample-Werte y zwischen sin(0) bis sin(360) bis überhaupt eine einzige Welle in das Sample eingetragen ist. Dann kannst Du in der nächsten Welle (den nächsten 100 Werten) die zugrundeliegende Frequenz um 1 ändern und damit wieder 100 y ausrechnenm dann die nächste Welle, u.s.w. So wärst Du nach 50 Wellen an der oberen Grenze und dann nach weiteren 50 wieder unten. Und das Ergebnis würde immer noch 4x pro Sekunde die volle Schwankung durchlaufen. 3. Sample-Erstellung Wie erstellst Du aus den Werten dann das Sample? Weisst Du das schon? Oder ist es ein bereits existierendes Audio, dass Du nur manipulieren möchtest? Ich habe so was schon unter BlitzMax gemacht. Vielleicht lässt sich ja da was auf BlitzBasic umschreiben. siehe: https://www.blitzforum.de/gallery/1307/ |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die "Schwankungsfrequenz" sollte nicht viel größer als 1 Hz sein.
Sonst ergibt das wieder einen mehr oder weniger konstanten Ton. Wenn ich Zeit habe, werde ich vielleicht eine Funktion ins Codearchiv stellen, mit der man bestimmte periodische Funktionen mit einer angegebenen Frequenz und Amplitude erstellen kann. Aber die Methode aus dem 2. Punkt ist eigentlich nicht notwendig, wenn die Schwankfrequenz nicht zu schnell ist. Ich vermute mal, dass er diesen Wave-Synthesizer nutzt. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
zu 1.: Sollte erstmal vorübergehend sein, später sollte dies durch eine beliebige periode oder auch nicht periodichene Welle verändert werden.
zu 2.: Später dann ja beliebig, zumteil dann auch nicht ganz, und ob die SchwankFrequenz zu schnell ist, ist doch erstmal unrelevant da man sie ja einfach ändern könnte oder nicht? Ich weis nicht ob ich den zweiten Teil von dir verstanden habe, meinst du das: Man muss für jede Frequenz erstmal eine Periodendauer oder Welle errechnet haben, bevor man das für die nächste macht. Da sonst bei der einen Frequenz zu dem entsprechenden Samplepunkt der maximale positive Wert bei der anderen aber ein andere z.B. der maximale negative Wert gerade aktuell ist. Außerdem ist die Anzahl der Sample-Werte für eine komplette Welle von der Frequenz abhängig, je tiefer desto länger. zu 3.: Ich weis nicht genau was du damit meinst. Ich erstelle damit eine Audiodatei(.wav). Die Tonhöhe einer bestehenden nicht periodischen Welle zu ändern dürfte recht schwer werden ![]() Die Audiodatei erstelle ich einfach in dem ich mit B3D den Header einer Wave Datei in eine Datei schreibe, und dann einfach das Sample hinten dran setze. Edit: @mpmxyz Einen Ton erkennt mal als solchen doch erst ab 16Hz oder so, also ist alles darunter noch kein Ton. Ich könnte mir außerdem auch eine Audiodatei vorstellen in der ein Ton mehr als einmal in der Sekunde seine Tonhöhe ändert. Das was ich benutze und dein Wave-Synthesizer sind eigendlich recht gleich, erstellen beide eine Wavedatei. Edit2: Ich habe im Internet etwas gefunden von dem ich das es in die Richtung gehen könnte: ![]() Ich würde mir die End-Welle so vorstellen wie bei "FM" zu sehen ist. Meine "Schwankfrequenz" wäre dann hier das "Signal", würde mir das helfen, habe mich nämlich noch nie mit Frequenzmodulation beschäftigt? |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Frequenz, die du bei "Ausschlag=..." einsetzt, sollte sich nicht so häufig bzw. schnell ändern, wenn man die Schwankungen überhaupt mitbekommen soll.
Ich weiß jetzt nicht, was das Ergebnis wäre, wenn man es trotzdem macht, aber ich glaube, dass es in die Richtung von Rauschen gehen könnte. (Vielleicht wird es aber auch der Mega-Sound! ![]() mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Entweder bin ich nicht in der Lage das zu implementieren, oder es funktioniert einfach nicht.
Zitat: Frequenz = Ursprungswert + Sin(Zeit/Samplerate*Schwankfrequenz) * Schwankstärke
Ausschlag = Lautstärke * Sin(Zeit/Samplerate*Frequenz) Das führt bei mir dazu das Welle zwar in der Tonhöhe schwankt, dies aber nicht periodisch also nicht nach der "Schwankfrequenz" und das sie insgesamt immer höher wird. Die Samplewerte werden hier mit erstellt: Zitat: Schwankstaerke# = 50
Schwankfrequenz# = 1 Ursprungswert# = 440 Lautstaerke = 3000 For x=0 To sample_rate * sekunden - 1 Frequenz# = Ursprungswert# + Sin((360.0*(Schwankfrequenz#/sample_rate))*x) * Schwankstaerke# Ausschlag# = Lautstaerke * Sin((360.0*(Frequenz#/sample_rate))*x) y# = Ausschlag# Next Könnt ihr euch ja selbst anhören, wenn ihr mir nicht glaubt. ![]() |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab mich vorhin an der Frequenzmodulation versucht, das Ergebnis sieht an sich in Ordnung aus, ich weiss aber nicht, ob es auch so klingt ![]() Graphics 800, 600, 0, 2
SetBuffer BackBuffer() Local Timer = CreateTimer( 60 ) Local Frequency1# = 720*15 Local Frequency2# = 720 Local Amplitude1# = 50 Local Amplitude2# = 250 Local Phase1# = 0.0 Local Phase2# = 0.0 While Not KeyHit( 1 ) Cls LockBuffer BackBuffer() Local OldY# = 400, OldFrequency# For X = 0 To 800 Local Frequency# = Frequency1# + Sin( X*( Frequency2#/360.0 ) + Phase2# )*Amplitude2# Local Y# = 300 + Sin( X*( Frequency# /360.0 ) + Phase1# )*Amplitude1# Line X - 1, OldY#, X, Y# Line X - 1, ( OldFrequency# - Frequency1# )*0.2 + 100, X, ( Frequency# - Frequency1# )*0.2 + 100 OldY# = Y# OldFrequency# = Frequency# Next UnlockBuffer BackBuffer() Phase1# = ( Phase1# + 0.5*Frequency1#/360.0 ) Mod 360 Phase2# = ( Phase2# + 0.5*Frequency2#/360.0 ) Mod 360 Flip 0 WaitTimer Timer Wend End Oben wird der Verlauf der Frequenz dargestellt, unten der 'Ton' |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
also, Kruemelator, ich muss da jetzt noch ein mal nachfragen, weil die Tipps hier in zwei total verschiedene Richtungen gehen...
Soll das Endergebnis ein Ton sein, der in einem Spiel z.b. eine Sirene nachahmt, dann ist mein Ansatz der Richtige, denn das Ganze spielt sich dann in sehr langsamenen Dimensionen ab. Oder planst Du tatsächlich etwas im FM-Bereich? Also ein Signal in einem anderen Signal zu transportieren? Also irgendetwas aus dem Amateurfunk-Bereich? Hier mal ein Beispiel für ein Sample einer Sirene für 400Hz +-100Hz Code: [AUSKLAPPEN] Graphics 1000,300 For x#=0 Until 44100 If x<22050 Then Hertz#=450-(22100-x)/221 Else Hertz#=450-(x-22100)/221 EndIf Debuglog hertz y#=Sin(x/44100*360*Hertz) Plot x/10,y*10+100 Next Flip WaitKey() Zu sehen ist die Veränderung kaum, weil zu langsam im Vergleich zu den Tonwellen. Aber der DebugLog Hertz zeigt das korrekte Verhalten. Denk dran, das die y-Werte später auf -128 bis +128 vergrößert werden müssen, und das sie im WAV-File auf 0 bis 255 angehoben werden müssen: Sample(x)=y*128+127 |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ob das nun schnell oder langsam ablaufen soll, kann man ja ganz einfach festlegen, sobald die Berechnungen mal stimmen. In meinem Code z.B. müsste man einfach Frequency 1 und 2 so anpassen, wie man es haben will; das Hauptproblem im Moment ist aber, die richtige Berechnung zu finden ![]() |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@mpmxyz, Midimaster, Noobody:
Danke für die Hilfsbereitschaft, scheint hier im Forum ja nicht sehr viele Leute zugeben die sich mit "Audioprogrammierung", oder wie man das nennt ![]() Habe mit jetzt selbst etwas zusammengebastelt, was sogar funktioniert, auch als Sound. ![]() Es ist sogar möglich nicht mit der Sinus-Funktion erstellte Werte zu benutzen um damit eine Frequenz zu verändern. Code: [AUSKLAPPEN] Global sample_rate
Global thfa_oldy# Global thfa_frequenzxverschiebung# Function tonhoehenfrequenzanpassung#(x,schwankung#,schwankbereich#,ausgangsfrequenz#) frequenz# = ausgangsfrequenz# + schwankbereich# * schwankung# thfa_frequenzxverschiebung# = 360.0*frequenz#/sample_rate*(x-1) - thfa_oldy# thfa_oldy# = (360.0*frequenz#/sample_rate*x-thfa_frequenzxverschiebung#) Return Sin(thfa_oldy#) End Function Ich weis die Variablenbenennung ist nicht die beste... ![]() Wenn der Wunsch vorhanden ist, dann erkläre ich es auch ausführlich. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group