Musiktempoänderung

Gast #4332953
Lesenswert?

Hallo,

Ein Lied ist auf einer SD-Karte gespeichert und mit dem ATmega2560 
verbunden.
Wie kann ich diese Datei mit C auslesen und bearbeiten? Die 
Geschwindigkeit der Musik soll um 10% verschnellert bzw. verlangsamt 
werden! Gibts dazu einen speziellen Algorithmus???

Wär cool wenn ihr mir helfen könntet...bin am verzweifeln

Lg Matthias
#4332971
Lesenswert?

Matthias O. schrieb:
> Es wird eine Wav datei sein

OK.
In einer WAV Datei ist einfach nur die abzuspielende Welle in Form von 
Werten enthalten. Wenn du also zb die Sequenz
1
0x10, 0x20, 0x30, 0x20, 0x10, ...

um 10% länger machen sollst, wie machst du das. Na, zb dadurch, dass du 
jeden 10-ten Wert 1 mal wiederholst. Aus den original 10 Bytes werden 11 
Bytes, was um 10% länger ist.
#4332995
Lesenswert?

Karl H. schrieb:
> Matthias O. schrieb:
>> Nein, darf sie nicht
>
> Dann hst du wenig Chancen. Irgendwas muss sich noch ändern.
> Da aber die wenigsten ein absolutes Gehör haben, wird es bis zu einem
> gewissen Grad kaum jemanden auffallen, dass sich die Tonlage ein wenig
> verschoben hat.

Du kannst nicht so einfach 10 Sinusschwingungen in der Zeitdauer 
unterbringen, die 11 Schwingungen benötigen würden. D.h. bei einem 
reinen Sinus, dessen Frequenz du kennst würde das gehen, indem du eine 
11-te Schwingung anhängst anstatt die 10 auf die Zeitdauer von 11 zu 
strecken. Nur blöderweise hast du keinen reinen Sinus.
Du könntest natürlich das Musikstück durch eine FFT jagen, die dir in 
der Samplefrequenz zu jedem Zeitpunkt die exakte spektrale Verteilung 
feststellt, die dann im Zeitbereich ein wenig strecken und mit einer 
Synthese dann wieder die Kurve generieren. Aber wenn du in diesem 
Jahrhundert noch fertig werden willst, würde ich das lassen.

Das einfachste ist sicherlich nach zb für 10% länger nach jeweils 10 
Bytes ein 11. Byte einschieben, das entweder eine Kopie des 10ten ist 
oder sich aus dem Mittelwert des original 10.ten mit dem original 11.ten 
Bytes ergibt.

Ich denke allerdings, dass die meisten Sound-Editoren eine derartige 
Operation problemlos erledigen können.
Gast #4333029
Lesenswert?

Hallo,

ich würde doch ganz klar sagen, dass sich ein Verdoppeln jedes zehnten 
Samples sehr komisch anhören wird. Da bleibt ja quasi die 
Lautsprechermembran kurz stehen -> Oberwellen.

Der klassische Ansatz ist, eine Kurve, die aus 10 Samples aufgebaut wird 
zu interpolieren und 11 äquidistante Punkte herauszunehmen. Mit der 
ursprünglichen Samplerate abgespielt, ergibt das eine Verlangsamung um 
10%. Aber eben auch einen Frequenzshift hin zu tiefer.

Ohne Shift kriegt man das nur mit einer FFT hin. Das kannst du aber nur 
sinnvoll auf einem DSP oder einem entsprechend angepassten µC rechnen. 
Der Cortex M4 ist für einfache DSP-Aufgaben geeignet.

Nichtsdestotrotz: Viel Spaß, das ist nicht gerade trivial.


Grüße,

Daniel
Gast #4333033
Lesenswert?

Achja, alternativ geht natürlich auch, die Samplerate zu variieren. 
Statt 48.000 kann man auch nur 43.200 Samples ausgeben. Auch das ergibt 
eine saubere, langsame, aber tiefere Wiedergabe.

Ohne Frequenzshift bleibt in meinen Augen nur der oben angesprochene Weg 
über das Spektrum auf einem DSP-Prozessor.

Gruß,

Daniel
Gast #4333057
Lesenswert?

Noch was bezüglich des Shifts:

Der Kammerton A4 hat eine Frequenz von 440 Hz. Eine Verlangsamung um 10% 
bedeutet eine Frequenz von 396 Hz. Bei 392 Hz liegt das G4. Eine 
Streckung um 10% bedeutet also im Allgemeinen (das ist proportional 
übertragbar auf alle anderen Töne) eine Transponierung um fast zwei 
Halbtöne.

Bei reiner Instrumentalmusik (insbesondere synthetische) wird man den 
Unterschied kaum hören. Kennt man jedoch die Stimme eines Interpreten, 
hört man das teilweise schon recht deutlich.

Und wenn du die Übung zum Mixen machst, dann kommst du um eine 
stufenweise Anpassung bzgl. Tempo und Tonart nicht herum.


Gruß,

Daniel
#4333170
Lesenswert?

Kennstd u jemanden, der jemanden kennt, der bei einem Radiosender 
arbeitet, und selbiger jemanden von der Technik kennt? Die praktizieren 
das auch, um sekundengenau den Beeep zur vollen Stunde für die 
Nachrichten erreicht.

Da wird aber der letzte Song nicht um bis zu 10 % beschleunigt, aber die 
Geschwindigkeit wird  angepasst.

der Musikdatenpool der Sender ist sicher nicht MP3, aber das 
Schallarchiv des SDR1 für die Sendung "Sie wünschen, wir spielen" 
existiert bestimmt immer noch, das war noch Vinyl auf 
7500€-Plattenspielern. Da hat man noch analog gepitcht, heute sind die 
Quellen digital, da ist der Zugriff quasi direkt, und man kann da auch 
pitchen.

Aber 10% sind schon ne Hausnummer über 100.

Die oben genannte Sendung war quasi ein kleines Kindheitstrauma für 
mich:

Es gab nur wenige Sender, und im Hörfunk anzuhören "ich bin siebzig 
Jahre alt, und ich möchte das Lied "Ich hab' Ehrfurcht vor schlohweissen 
Haaren" oder "Es gibt, Millionen von Sternen...", bzw "Danke, für diesen 
guten Morgen"...

OK, etwas OT, aber bei einem Sender mal nachfragen bringt evtl Info.

Die pitchen schon ab und an mal bei interaktiven Sendungen, wenn da ein 
Sonderwunsch reinkommt.
Gast #4333695
Lesenswert?

@avr

Du wiederholt doch eigentlich nur den allgemeinen Konsens? Elm Chan 
beschreibt einen Pitch Changer. Dass der mit einem AVR realisierbar ist, 
darüber waren wir uns einig. Neu ist,dass das auch ohne Tempoänderung 
funktioniert, indem man immer wieder kleine Sequenzen verwirft. Wie das 
in der Praxis klingt, bleibt zu testen.

Der TE möchte aber eine Tempoänderung ohne Pitch. Also exakt das 
Gegenteil. Das sehe ich mit dem bisschen Pointerarithmetik nicht 
realisierbar. Du etwa?

Also, Freiwillige vor. Wer löst das auf einem AVR? Ich wil nicht sagen, 
das das nicht möglich wäre, mir fehlt aber das mathematische 
Verständnis. Welche Operation im Frequenzbereich entspricht der 
Tempoänderung ohne Pitch im Zeitbereich?
Gast #4333702
Lesenswert?

Daniel schrieb:
> Der TE möchte aber eine Tempoänderung ohne Pitch. Also exakt das
> Gegenteil.

Nein nicht das Gegenteil. Versuch doch bitte mal seine Ausführungen zu 
verstehen. Pitch Änderung ist technisch gesehen genau das gleiche wie 
Tempoänderung. Der Unterschied liegt bei der Abspielgeschwindigkeit 
(Samples/s).

Abgesehen davon ist es wohl relativ einleuchtend, dass man sehr grobe 
Änderungen am Audiosignal vornehmen muss wenn man das Tempo ohne Pitch 
ändert. Diese Pointerarithmetik (was eigentlich nur ein Ringbuffer ist), 
wurde auch schon bei analogen Geräten angewendet. Dort gab es spezielle 
Leseköpfe mit mehrere Spulen. Diese Köpfe haben sich gedreht. Dadurch 
konnte man beim abspielen die Tonhöhe verändern.
Persönliche Seite #4333765
Lesenswert?

Was ihr da machen wollt, nennt sich formantenunabhängige Transponierung 
und gelingt nur, wenn man einerseits resampelt und andererseits lokale 
Pausen verkürzt / verlängert. Das läuft auf einen diskreten Algorithmus 
hinaus, der Nulldurchgänge findet und nutzt. Es gibt in professionellen 
Audio-Programmen mehrere Tuning-Prozess-Optionen, die das in 
unterschiedlicher Qualität und mit verschiedenen Methoden leisten.

Magix Sampltitude und Steinberg Wavelab können das z.B.

Der Grundklang der Musik wird allerdings hierbei nicht verändert - also 
der Ivan-Effekt bleibt aus. Das Ergebnis ist gemessen am Rechenaufwand 
erstaunlich gut und ehrlich gesagt konnte auch Ich trotz mehrerer 
Versuche in dem Thema, einen guten Algo zu entwickeln, bisher nicht 
wirklich da heranreichen. Lediglich der manuelle Schnitt ist da 
überlegen, aber das geht nur bei Sprache / Synchronarbeit.

Es gibt allerdings teilweise hörbare glitches, die man nacharbeiten muss 
und es funktioniert auch nur für einige Halbtöne, d.h. 10%, weil das 
sonst unweigerlich zu unakzeptablen Fehlern führt.

Das Ganze zielführend, kontinuierlich und ohne diskrete Bearbeitung zu 
machen, klappt nur mit Faltungsoperationen nach vorheriger Zerlegung von 
Samples in die musikalischen Aspekte Tonhöhe und Formant (= 
Frequenzhüllkurve). Im Prinzip ist das eine 2D-FFT. Mit Hilfe der 
Faltung können die Frequenzen in nahezu beliebigem Tempo wieder 
zusammengesetzt werden und dem Formanten-EQ geshaped werden. Die 
bekannten Autotune-Geräte in der Musikindustrie (z.B. Antares) oder auch 
die V-Synthese von Roland arbeiten so.

Das Signal ist dann mehr oder weniger frei von Glitches, aber Artefakte 
sind unüberhörbar. Schon ein Signal, das ungeändert durch die 
FFT-IFFT-Kette läuft ist nicht mehr authentisch, weil es zweimal 
gefenstert wurde.

Es klingt aber nicht so arg schlecht, man kann damit Chorpassagen 
mischen und Mehrklang-Akkorde aus Stimmen und Instrumenten live in allen 
Tonarten spielen.

Wenn im vorliegenden Fall die Frequenzänderung statisch ist, könnte man 
einen eng aufgelöste FFT machen und statisch um genau 1 oder 2 Punkte 
verschieben. Mit einem guten Filter / Fenster bei der IFFT kann man da 
schon einen vernüftigen Klang hinbekommen. Engmaschig heisst hier 
konkret eine nichtlineare FFT mit z.B. 128 Tönen in Halbton-Abstufung -> 
196/185 Frequenzsprung. Wenn man genau einen Ganzton nähme, wären es 
rund 12% bei 64 Frequenzen. Das in Echtzeit gewonnene FFT-Profil ist 
dann die Formantenkurve.
Persönliche Seite #4333768
Lesenswert?

Thomas S. schrieb:
> Da wird aber der letzte Song nicht um bis zu 10 % beschleunigt, aber die
> Geschwindigkeit wird  angepasst.
Nee :-)  Die machen da kein DJ-ING. Die Software startet das Material 
passend, damit es hinkommt. Die stellen das meistens vorher zusammen und 
pressen jede Sekunde raus. Die Summation und Einstreuung von Werbung und 
Jingles geht da auch komplett als overlay und wird automatisiert 
eingerechnet.

Daniel schrieb:
> Der Kammerton A4 hat eine Frequenz von 440 Hz.
In ->Kammer-Orchestern sind es 443 und auch bei sonstiger akustischer 
Musik habe ich noch nie Material gehabt, wo ein A auf 440Hz lag. Musik, 
die mit Gitarren aufgenommen wurde liegen besonders schräg, weil die 
gerne mal ein C vom Keyboard holen, dann nach Gehör 3x die Quinte 
bilden, um über G,D zum A und E zu gelangen. Da sie unwillkürlich 
ziemlich rein stimmen, läuft der Ton weg. Genau das macht dann im 
Übrigen die voluminös klingende Gitarre.


> Bei reiner Instrumentalmusik (insbesondere synthetische) wird man den
> Unterschied kaum hören.
Naja, es wird ja nicht nur das Tempo höher sondern auch der Anschlag 
schneller. Besonders bei Basstrommeln, Schlagwerk, aber auch dem 
Ausklangverhalten (Decay) von Instrumenten hört man das Tempo. Eine 
Gitarrensaite, die hochgedreht wurde, klingt scheinbar schneller ab, so 
als hätte sie mehr Dämpfung. Würde sie hingegen real schneller gespielt, 
dann käme der neue Ton in den noch etwas lauteren alten hinein und würde 
anders interferieren. Das ist absolut hörbar. Ich inzwischen mehr oder 
weniger zielsicher heraus, wenn z.B. Toms und Becken langsamer 
eingespielt und dann schneller gemischt wurden, weil der Drummer das 
Tempo nicht sauber hinbekam :-) Auch bei Sängern kann man es hören, weil 
das Vibratotempo nicht mehr zum Gesangtempo passt, da es ja ebenfalls 
steigt.
Gast #4334046
Lesenswert?

Karl H. schrieb:
> Doch das will er.
> Er will, dass ein Erzähler langsamer spricht. Damit er den Wetterbericht
> anstatt in 5 Minuten in 6 Minuten verliest. Aber er will nicht, dass
> sich die 25 jährige Sprecherin wie Ivan Rebroff anhört.

Mann, dann lies doch mal den nächsten Satz, statt nur einen Brocken 
herauszuzitieren...
Den Pitch entfernt man durch eine andere Samplerate beim Ausgeben und 
dadurch ändert sich effektiv nur die Geschwindigkeit.
Es ist wohl klar, dass dieses Verfahren nicht das beste ist. Aber aus 
meiner Sicht das einzig praktikable auf einem Atmega.
Persönliche Seite #4336492
Lesenswert?

avr schrieb:
> Den Pitch entfernt man durch eine andere Samplerate beim Ausgeben und
> dadurch ändert sich effektiv nur die Geschwindigkeit.

Nein, entweder, man spielt es mit einer anderen Rate ab, dann ändert 
sich beides, nämlich Tonhöhe UND Tempo, oder man resampelt es, damit es 
auf einer anderen Rate gespielt werden kann, dann bleibt beides gleich.

Den inneren, festen Zusammenhang zwischen Tonhöhe und Tempo kann man 
nicht mehr ändern, weil dieser zur Zeit des Sampelns bestimmt wurde, 
egal, was man später mit dem Signal macht.
Gast #4337189
Lesenswert?

Jürgen S. schrieb:
> Nein, entweder, man spielt es mit einer anderen Rate ab, dann ändert
> sich beides, nämlich Tonhöhe UND Tempo, oder man resampelt es, damit es
> auf einer anderen Rate gespielt werden kann, dann bleibt beides gleich.

ja es ändert sich beides. Und wenn man den pitch zurückkorrigiert (siehe 
elm-chan), hat man am Ende nur das Tempo verändert. Und das ganze geht 
auch ohne Probleme auf einem Atmega. Auch wenn das hier keiner glauben 
will...

Wie gut die Qualität ist kann ich nicht beurteilen, aber im Vergleich zu 
der Alterative mit FFT ist das Verfahren doch in kürzester Zeit 
implementiert.
Gast #4337525
Lesenswert?

avr schrieb:
> Jürgen S. schrieb:
>> Nein, entweder, man spielt es mit einer anderen Rate ab, dann ändert
>> sich beides, nämlich Tonhöhe UND Tempo, oder man resampelt es, damit es
>> auf einer anderen Rate gespielt werden kann, dann bleibt beides gleich.
>
> ja es ändert sich beides. Und wenn man den pitch zurückkorrigiert (siehe
> elm-chan), hat man am Ende nur das Tempo verändert. Und das ganze geht
> auch ohne Probleme auf einem Atmega. Auch wenn das hier keiner glauben
> will...

Da hast du recht, das ist eine schnelle und einfach zu implementierende 
Lösung. Das hat aber vermutlich keiner mitbekommen, dass du beide 
Methoden kombinieren willst. Jetzt ist es klarer.

Und falls der TE noch mitliest: DAS IST DIE LÖSUNG!
#4337547
Lesenswert?

Daniel schrieb:
> Da hast du recht, das ist eine schnelle und einfach zu implementierende
> Lösung. Das hat aber vermutlich keiner mitbekommen, dass du beide
> Methoden kombinieren willst. Jetzt ist es klarer.
>
> Und falls der TE noch mitliest: DAS IST DIE LÖSUNG!

Bei dem Wissensstand, den der TE bisher demonstriert hat, bezweifle ich 
dass er diese Lösung implementieren kann.
Persönliche Seite #4338188
Lesenswert?

Rufus Τ. F. schrieb:
> Nein. Genau darum geht es hier, die Tonhöhe beizubehalten und das Tempo
> zu ändern.
>
> https://de.wikipedia.org/wiki/Time-Stretching

Ja, das war das Ziel, aber ich antwortete auf die Beschreibung weiter 
oben, das mit angeblichem pitchen oder resampeln tun zu wollen. Das geht 
eben nicht. Das Signal muss zerlegt und neu zusammengesetzt werden und 
dies künstlich unter den Randbedingungen der FFT. Details und Probleme 
hatte ich erörtert. Dieser Sachverhalt ist auch in den gelinkten 
Artikeln so beschrieben. Und wenngleich dort die Methodik als machbar 
gepriesen wird, muss klar dargestellt werden, dass dort deutliche 
Artefakte entstehen. Die Problematik besteht in der unzureichenden 
Auflösung der FFT und der nicht ganzzahlig dazu passenden Frequenzen. 
Die dazu nötige Fensterung verzerrt das Signal derart, dass es bei der 
Synthese unweigerlich zu Fehlern kommt und zwar zu hörbaren.

Dies gilt um so mehr für die vorgestellte AVR-Methodik auf der 
ELM-Chan-Seite: Der dort (und auch anderswo sehr gerne) gemachte 
Denkfehler ist der, dass man ja nur in den Nullpunkten schneiden und 
loopen müsse, um störungfreie Pausen und Cuts applizieren zu können. Das 
ist Mitnichten so, denn es gibt streng genommen beim Audio keinen 
Nullpunkt, da dieser letztlich immer vom Folgefilter (z.B. letztlich den 
Lautsprecher) neu definiert wird. Stichwort AC-Kopplung. Jedesmal, wenn 
man dort unterbricht, fügt man dem Signal neue Frequenzen hinzu, weil 
ein Phasensprung ausgelöst wird - auch wenn man den nicht direkt sieht.

Unterbrechbar und loopbar sind / wären nur die Frequenzen an sich und 
die haben je nach Betrachtung alle zu einem anderen Zeitpunkt ihren 
"Nullpunkt". Dass sie mal zufällig an irgendeinem Punkt zur absoluten 
Null summieren, macht keine Aussage - zumindest nicht für diesen 
Sachverhalt. Will man das aber richtig tun, landet man eben wieder bei 
der FFT und das ist hinreichend untersucht und probiert, was damit geht 
und was nicht.

Und um es gleich vorwegzunehmen, ja, ich habe das mit FPGAs gemacht, und 
Ja, damit geht nochmal erheblich mehr, als mit den DSPs (bei mir die 
Chameleon mit 56303) -  aber Nein, auch da ist es nicht wirklich zu 
machen, da klar hörbar!  Wie schon gesagt, ist es bereits nicht möglich, 
ein Signal komplett in eine FFT zu zerlegen und unverändert wieder mit 
einer iFFT zusammenzubauen. Man hört immer das Fenster oder die sich 
bildenden Kammfilter-/Phaseneffekte bei sehr eng liegenden 
Abtastfrequenzen. Lässt man das Fenster bei beiden (i)FFTs weg, gelingt 
zwar eine theoretisch exakte Rekonstruktion, aber sie scheitert an der 
Auflösung. Dreht man die Auflösung hoch, wird die Periodenzeit zu gross 
und man kann es nicht mehr mit der Hüllkurve modulieren, um die 
Lautstärke zu erhalten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren