4.2 SOUND BEARBEITEN

 

 

EINFÜHRUNG

 

Wie du weisst, werden die Soundsamples (Abtastwerte eines Sounds) in einer Liste abgespeichert und können mit dieser Liste wieder abgespielt werden. Willst du den Sound bearbeiten, so kannst du also ganz einfach diese Liste entsprechend verändern.

PROGRAMMIERKONZEPTE: Rechteckschwingung, Ganzzahldivision, Modulo-Operation

 

 

LAUTSTÄRKE VERÄNDERN

 

Das Programm soll die Lautstärke des Sounds auf einen Viertel reduzieren. Dazu kopierst du die Soundliste in eine andere Liste, wobei jedes Listenelement auf ¼ seines ursprünglichen Werts gesetzt wird.

from soundsystem import *

samples = getWavMono("mysound.wav")
soundlist = []
for item in samples:
    soundlist.append(item // 4)

openMonoPlayer(soundlist, 22010)
play()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Um eine Liste umzukopieren, erstellst du zuerst eine leere Liste und füllst sie dann mit append().  Damit du wieder eine Liste mit Integers erhältst, musst duwir  die Ganzzahldivision (mit verdoppeltem Bruchstrich) verwenden.

 

 

VERWENDEN DES LISTENINDEX

 

Im folgenden Beispiel durchläufst du die Liste über ihren Listenindex und veränderst die Listenelemente ohne eine neue Liste zu erstellen. Du stellst den Sound vor und nach der Veränderung grafisch dar.

 


from soundsystem import *
from gpanel import *

samples = getWavMono("mysound.wav")

makeGPanel(0, len(samples), -33000, 33000)
for i in range(len(samples)):
    if i == 0:
        move(i, samples[i] + 10000)
    else:
        draw(i, samples[i] + 10000)

for i in range(len(samples)):
    samples[i] = samples[i] // 4

for i in range(len(samples)):
    if i == 0:
        move(i, samples[i] - 10000)
    else:
        draw(i, samples[i] - 10000)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Als Listenindex verwendet man oft den Variablennamen i. Wenn du mit einer for-Struktur

for i in range(10):
den  Schleifenblock durchläufst, nennt man i auch einen Stepper.

 

 

SOUNDS GENERIEREN

 

Es ist spannend, eigene Sounds zu erzeugen, indem du die Soundliste nicht von einer Sounddatei einliest, sondern die Listenelemente selbst erzeugst. Für einen "Rechtecksound" speicherst du über einen gewissen Indexbereich die Werte 5000 und nachfolgend über den gleich langen Bereich -5000 in die Liste.

from soundsystem import *

samples = []
for i in range(4 * 5000):
   value = 5000
   if i % 10 == 0:
       value = -value
   samples.append(value)

openMonoPlayer(samples, 5000)
play()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Die Abtastrate 10000 Hz entspricht einem Soundsample alle 0.1 ms. Wir wollen immer nach 10 Werten, also alle 1 ms das Vorzeichen ändern. Dies entspricht einer Rechteckperiode von 2 ms, was einen Klang von 500 Hz ergibt. Wir verwenden den Modulo-Operator %, der den Rest bei der Ganzzahldivision liefert. Die Bedingung i % 10 == 0 ist also wahr bei i = 0, 10, 20, 30, usw.

 

 

AUFGABEN

 

1.


Verwende die Listenoperation reverse(), um einen Sound von hinten nach vorne abzuspielen, z.B. einen gesprochenen Text.


2.


Mit der Slice-Notation liste[start: end] kann man Liste erstellen, die nur die Elemente mit dem Index start bis end (ohne das letzte Element) enthält. Entferne damit einen Teil eines dir vorliegenden Sounds.


3.


Lese einen Soundclip ein und bestimme den maximalen Amplitudenwert. Schreibe ihn in die Titelzeile des GPanels und stelle den Sound grafisch dar. Erhöhe nun alle Soundsamples so, dass der maximale Amplitudenwert 32767 beträgt (maximale Lautstärke) und stelle den Clip wieder dar. (Wichtige Funktion von bekannten Soundeditoren).


4*.


Erzeuge mit der Abtastrate von 10000Hz einen Sinuston von ungefähr 500 Hz, indem du die Sinusfunktion math.sin(x) verwendest, die immer nach x = 2π = 6.28 neu startet. Um Zugriff auf die Sinusfunktion zu erhalten, musst du import math einfügen.


5*.


Überlagere (durch Addition der Abtastwerte) zwei Sinustöne mit benachbarten Frequenzen. Was stellst du beim Zuhören fest?