sound

5. SOUND

 

 

DU LERNST HIER...

 

wie du mit dem Calliope Töne, Tonfolgen und kurze Melodien abzuspielen kannst.

 

 

MUSTERBEISPIELE

 

Der Calliope verfügt über einen eingebauten Lautsprecher, der auf dem Bord gut sichtbar ist.

Um Töne und Melodien abzuspielen, importierst du das Modul music.

 

Eine Tonfolge abspielen

Mit dem Befehl pitch(f, 500) wird ein Ton mit der Frequenz f während 500 Millisekunden abgespielt. Um mehrere Töne nacheinander abzuspielen, gibst du die zugehörigen Frequenzen in einer Liste an und durchläufst diese mit einer for-Schleife.

Eine Tabelle mit Tönen und ihren Frequenzen findest du im Overlay-Fenster: Ein Ton mit der Frequenz 0 ist gleichbedeutend mit einer Pause.

from music import *

song = [262, 294, 330, 349, 392, 392, 392, 0, 440, 440, 440, 440, 392]
for f in song: 
   pitch(f, 500)
► In Zwischenablage kopieren

 

Eingebaute Melodien abspielen
Einige Melodien sind bereits eingebaut. Ihre Namen findest du hier oder in der Dokumentation. Du kannst das Abspielen der Melodien mit der Verwendung der Buttons kombinieren. Wenn du den Button A  drückst, wird die Melodie JUMP_UP abgespielt, beim Drücken des Buttons B die Melodie JUMP_DOWN.

from calliope_mini import *
from music import *

while True:
    if button_a.was_pressed():
        play(JUMP_UP)
    if button_b.was_pressed():
        play(JUMP_DOWN)
    sleep(10)
► In Zwischenablage kopieren

Was passiert, wenn du die beiden Button miteinander gedrückt hältst?

 


Ein akustisches Lagemessgerät
Messgeräte mit akustischen Ausgaben sind sehr beliebt. Du erzeugst hier ein Tonsignal, dessen Höhe von der Seitwärtsneigung des Calliope abhängt. Ausgehend von einer Anfangsfrequenz f0 = 1000, berechnest du die steigenden bzw. fallenden Tonfrequenzen für Halbtöne der wohltemperierten Stimmung und spielst jeden Ton 100 Millisekunden lang ab.

Mit dem Button B kannst du das Tonsignal ausschalten.

from music import *
from calliope_mini import *

def beep(n):
    freq = int(f0 * r**n)
    pitch(int(r**n * f0), 100)
    sleep(50)

f0 = 1000
r = 2**(1/12)
while not button_b.was_pressed():
    n = int(accelerometer.get_x() / 100)
    beep(n)
    sleep(10)
► In Zwischenablage kopieren

 

Mikrofon

Der Calliope besitzt ein Mikrofon, welches Geräusche detektieren kann. Das Mikrofon ist nur 3x4 mm gross. Die Funktion
isClicked(level , rearm_time
gibt True zurück ,falls der Schallpegel den vorgegebenen Pegel (level = 1...500) übersteigt. Die Detektion wird danach während der rearm_time unterdrückt

.

 

In deinem Programm wird der Schallpegel auf 20 gesetzt. Der Mikrofon reagiert bereits auf schwache Geräusche (Pfeifen, Klatschen, auf Tischklopfen usw.). Du musst aber warten bis das Programm gestartet ist und im Terminalfenster "starting" ausgeschrieben ist. Falls ein Geräusch detektiert wird, leuchten auf dem Display während 500 Millisekunden einige LEDs.

 

from calliope_mini import *
from cpmike import *
    
print("starting")
while True:
    if isClicked(level = 20, rearm_time = 800):
        display.show(Image.DIAMOND)
        sleep(500)
        display.clear()
► In Zwischenablage kopieren

 

Kopfhörer oder Lautsprecher anschliessen

Anstelle des eingebauten Lautsprechers, der die Töne nur schlecht wiedergibt, kannst du einem externen Kopfhörer oder aktiven Lautsprecher (mit einem eingebauten Verstärker) an den Calliope anschliessen. Dazu brauchst du zwei Kabel mit Krokodilklemmen. Mit dem ersten Kabel (hier gelb) verbindest du den Pin GND mit dem hinteren Teil des Kopfhörersteckers. Mit dem zweiten Kabel (hier rot) verbindest du den Pin1 mit dem vorderen Teil des Kopfhörersteckers.

 

Um den Sound über den Pin1 auszugeben, musst du das Modul calliope_mini importieren und in der Funktion pitch() oder play() den Parameter pin auf pin1 setzen.

  Damit du den Sound in den beiden Hörmuscheln hörst, musst du versuchen, die rote Krokodilklemme so anzubringen, dass sie die beiden vorderen Teile des Steckers berührt.
from music import *
from calliope_mini import *

print("starting")
play(ENTERTAINER, pin = pin1)
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

Den Kopfhörer musst du an die Ausgänge, die mit GND und P1 bezeichnet sind, anschliessen. Einen Ton mit der Frequenz f spielst du mit dem Befehl pitch(f, time) ab. Mit play(song) kannst du ganze Melodien, entweder als Tonfolge oder in musikalischer Notation abspielen.

Das eingebaute Mikrofon detektiert die Umgebungsgeräusche.

 

 

ZUM SELBST LÖSEN

 

 

1.
a)

Schreibe ein Programm, welches die folgende Tonfolge  abspielt:

song = [262, 294, 330, 262, 262, 294, 330, 262, 330, 349, 392, 330, 349, 392]

Du kannst selbstverständlich auch eigene Tonfolgen komponieren.

b)

Spiele die Tonfolge schneller bzw. langsamer ab.


2.

Du kannst eine Melodie wiederholt abspielen lassen, indem du play() mit zusätzlichen Parametern verwendest, beispielsweise für die Melodie BIRTHDAY

play(BIRTHDAY, loop = True)

3.

play(BIRTHDAY, wait = False, loop = True)

Der Parameter wait = False bewirkt, dass das Abspielen im Hintergrund abläuft und das Programm weiter läuft. Du kannst also während des Abspielens z. Bsp. LEDs einschalten oder Buttons verwenden.

Schreibe ein Programm, dass das Geburtstagslied solange endlos abspielt, bis du den Button A klickst. (Anmerkung: Du kannst eine Soundausgabe mit dem Befehl stop() beenden.)

4.

Das Mikrofon deines Calliope reagiert wie folgt auf Geräusche: Jedesmal, wenn du auf den Tisch klopfst, wird die Melodie JUMP_UP abgespielt.

 

 

ZUSATZSTOFF

 

Melodien in musikalischer Notation abspielen

Die Notation hält sich an folgende Regeln:

  • Die zwölf Halbtöne einer Oktave haben  mit Kreuz geschrieben die Bezeichnungen C, C#, D, D#, E, F, F#, G, G#, A, A#, H  (auch mit Kleinbuchstaben). Für die Pause verwendet man die Note "R"
  • Will man die Oktave wechseln, so schreibt man eine Oktavezahl hinter die Note, also C2 für die zweite Oktave (zu Beginn ist man in der 4. Oktave). Diese Oktave gilt dann für alle folgenden Noten, bis wieder eine Oktavezahl angegeben wird
  • Hinter der Note kann ein Doppelpunkt mit einer Angabe der Dauer (in Ticks) stehen. Alle folgenden Noten werden dann mit dieser Dauer abgespielt, bis wieder eine neue Angabe der Dauer folgt.

Um eine Melodie zu komponieren, schreibst du die Noten in eine Liste, beispielsweise im folgenden Programm für einen Dur-  und nachfolgenden Moll-Akkord.

from music import *

melody = ['e:4', 'f#', 'g#', 'r:2', 'e', 'f#', 'g:4']
play(melody)
► In Zwischenablage kopieren


Morse

Der Morsecode wird zur Übermittlung von Nachrichten verwendet. Buchstaben, Satzzeichen und Zahlen sind als kurzes Signal, langes Signal und Pause codiert. Mit dem eingebauten Lautsprecher kannst du sehr einfach Morse-Nachrichten erzeugen. Es ist zweckmässig, den Code in einem Python-Dictionary abzulegen.

from calliope_mini import *
from music import *

dt = 100 # adapt to your speed

morse = {
'a':'.-'   , 'b':'-...' , 'c':'-.-.' , 'd':'-..'  , 'e':'.'    ,
'f':'..-.' , 'g':'--.'  , 'h':'....' , 'i':'..'   , 'j':'.---' ,
'k':'-.-'  , 'l':'.-..' , 'm':'--'   , 'n':'-.'   , 'o':'---'  ,
'p':'.--.' , 'q':'--.-' , 'r':'.-.'  , 's':'...'  , 't':'-'    ,
'u':'..-'  , 'v':'...-' , 'w':'.--'  , 'x':'-..-' , 'y':'-.--' ,
'z':'--..' , '1':'.----', '2':'..---', '3':'...--', '4':'....-',
'5':'.....', '6':'-....', '7':'--...', '8':'---..', '9':'----.',
'0':'-----', '-':'-....-', '?':'..--..', ',':'--..--', ':':'---...',
'=':'-...-'}

def dot():
    pitch(1000, dt)
    sleep(dt)

def dash():
    pitch(1000, 3 * dt)
    sleep(dt)

def transmit(text):
    for c in text:
        if c == " ":
            sleep(4 * dt)
        else:
            c = c.lower()
            if c in morse:
                k = morse[c]
                for x in k:
                    if x == '.':
                        dot()
                    else:
                        dash()
            sleep(2 * dt)

transmit("komme morgen abend")
► In Zwischenablage kopieren

 

 

ZUM SELBST LÖSEN

 
5.

Schreibe die folgende Melodie in der musikalischen Notation und spiele sie ab.



6. Schreibe ein Programm, welches eine Geheimnachricht im Morsecode so langsam abspielt, dass dein(e) Kamerad(in) sie entziffern kann.

 

5-1
Fachliche Hinweise:

Einige Tonfrequenzen:

Ton Frequenz Ton Frequenz    

h' 494 h'' 988    
a' 440 a'' 880    
g' 392 g'' 784    
f' 349 f'' 698    
e' 330 e'' 660    
d' 294 d'' 588    
c' 262 c'' 524 c''' 1048

5-2
Fachliche Hinweise:

Melodien, die Modul music definiert sind:

ADADADUM - Eröffnung von Beethoven's 5. Sinfonie in C Moll
ENTERTAINER - Scott Joplin's Ragtime Klassiker
PRELUDE -J.S.Bach's 48 Preludien und Fugen
ODE - "Ode an Joy" Thema aus Beethoven's 9. Sinfonie in D Moll
NYAN - das Nyan Cat Thema
RINGTONE - ein Klingelton
FUNK - ein Geräusch für Geheimagente
BLUES - ein Boogie-Woogie Blues
BIRTHDAY - "Happy Birthday to You..."
WEDDING - der Chorus des Bräutigams aus Wagner's Oper "Lohengrin"
FUNERAL - der "Trauerzug", Chopin's Klaviersonate
PUNCHLINE - a lustiger Tonclip, nachdem ein Witz gemacht wurde
PYTHON - aus "Monty Python's Flying Circus"
BADDY - Filmclip aus "The Baddy"
CHASE - Filmclick aus einer Jagdszene
BA_DING - ein Signalton, der darauf hinweist, dass etwas geschehen ist
WAWAWAWAA - ein trauriger Posaunenklang
JUMP_UP - für Spiele, um auf eine Aufwärtsbewegung hinzuweisen
JUMP_DOWN - für Spiele, um auf eine Abwärtsbewegung hinzuweisen
POWER_UP - ein Fanfarenklang
POWER_DOWN - ein trauriger Fanfarenklang, wenn etwas verloren gegangen ist

5-3
Fachliche Hinweise:

Da bei der wohltemperierten Stimmung die Oktave (Verdoppelung der Frequenz)  in 12 Halbtöne mit gleichem Frequenzverhältnis r eingeteilt wird, gilt r12 = 2, also
r =

5-4
Fachliche Hinweise:

Statt einen Kopfhörer kann man auch einen billigen, verstärkerbetriebenen Lautsprecher (z.B. eine "Hamburgerbox") verwenden (aber nicht direkt einen Lautsprecher ohne Verstärker).