TigerJython | xx für Gymnasien |
Ton | Frequenz | Ton | Frequenz |
h' | 495 | h'' | 988 | ||
a' | 440 | a'' | 880 | ||
g' | 396 | g'' | 784 | ||
f' | 352 | f'' | 698 | ||
e' | 330 | e'' | 660 | ||
d' | 297 | d'' | 588 | ||
c' | 264 | c'' | 524 | c''' | 1048 |
Diese Frequenzen lassen sich berechnen. Wenn man von einem Grundton (z. Bsp. a' mit f = 440 Hz) ausgeht, erhält man die Frequenz des darauf folgenden Halbtons mit dem Faktor 1.05946 und den nächsten ganzen Ton mit dem Faktor 1.05946 * 1.05946 ≈ 1,122. (z. Bsp. h' = 440 * 1.122 = 494). Die Frequenzen in der Tabelle sind gerundet.
Warum diese Faktoren? Eine Oktave (Frequenzverhältnis c'' : c' = 2 : 1) ist in zwölf Halbton-Schritte aufgeteilt. |
Beispiel 1: Eine Melodie spielen
|
Erklärungen zum Programmcode:
for f in song : geht alle Elemente f der Liste song durch | |
playTone(f, 200) : spielt Tone mit der Frequenz f 200 Millisekunden lang |
Beispiel 2: Die Turtle zeichnet eine Treppe und spielt dabei immer höhere Töne. Wenn man eine c-dur Tonleiter abspielen will, muss man die Halbtöne zwischen e' und f' und zwischen h' und c'' beachten. Nach 3 ganzen Tönen folgt ein Halbton, dann wieder 3 ganze Töne und ein Halbton.
|
Erklärungen zum Programmcode:
f = f * r * r : Frequenz des nächsten ganzen Tons | |
f = f * r : Frequenz des nächsten Halbtons |
Beispiel 3: Nicht blockierende Funktion playTone().
|
|
Erklärungen zum Programmcode:
playTone(f, 500, block = False) : nicht blockierende Funktion, die sofort zurückkommt und nicht erst nach 500 Millisekunden |
|
|
# Tu14c.py from gturtle import * def drawPiano(): setPenColor("black") for x in range(-200, 160, 50): setPos(x, -100) for k in range(2): fd(216).rt(90).fd(50).rt(90) setPenWidth(32) for x in [-150, -100, 0, 50, 100, 200]: setPos(x, 0) fd(100) def onMouseHit(x, y): if x > -200 and x < 215 and y > -100 and y < 100: i = int((x + 200)/50) setPos(x, y) if getPixelColorStr() == "black": k = int((x + 215) / 50) f = blacktones[k] else: f = whitetones[i] playTone(f, 200) whitetones = [262, 294, 330, 349, 392, 440, 494, 524] blacktones = [0, 277, 311, 0, 360, 415, 466, 0, 555] makeTurtle(mouseHit = onMouseHit) hideTurtle() drawPiano() addStatusBar(20) setStatusText("Click a piano key to play!") |
Programmcode markieren
|
Erklärungen zum Programmcode:
drawPiano() : zeichnet eine Klavier-Oktave | |
onMouseHit(x, y) : wird beim Mausklick aufgerufen, liefert die Koordinaten des Mausklicks | |
getPixelColorStr() : liefert die Hintergrundfarbe an der aktuellen Turtleposition | |
i = int((x + 200)/50) : berechnet in welchem Rechteck der Mausklick erfolgt hat | |
f = tones[i] : holt das i-te Element der Liste tones |
|
|
# Tu14d.py from gturtle import * import random def drawPiano(): setPenColor("black") for x in range(-200, 160, 50): setPos(x, -100) for k in range(2): fd(216).rt(90).fd(50).rt(90) setPenWidth(32) for x in [-150, -100, 0, 50, 100, 200]: setPos(x, 0) fd(100) whitetones = ["c'", "d'", "e'", "f'", "g'", "a'", "h'", "c''"] blacktones = ["c#'", "d#'", "f#'", "g#'", "a#'", "c#''"] makeTurtle() hideTurtle() drawPiano() showTurtle() for n in range(30): i = random.randint(0, 13) if i < 8: x = i * 50 - 175 setPos(x, -50) f = whitetones[i] else: blackPos = [-150, -100, 0, 50, 100] k = i - 9 x = blackPos[k] setPos(x, 30) f = blacktones[k] playTone(f, 100, instrument = "piano") |
Programmcode markieren
|
Erklärungen zum Programmcode:
whitetones = ["c'", "d'", "e'", "f'", "g'", "a'", "h'", "c''"] : Liste der weissen Tasten mit Noten-Namen | |
blacktones = ["c#'", "d#'", "f#'", "g#'", "a#'", "c#''"] : Liste der schwarzen Tasten | |
i = random.randint(0, 13) : erzeugt eine ganzzahlige Zufallszahl zwischen 0 und 13 | |
x = i * 50 - 175 : berechnet die x-Koordinate der weissen Tasten | |
x = blackPos[k] : holt die x-Kaaordinate der schwarzen Taste aus der Liste blackPos |
Aufgaben Serie 14 |
1) | Erstelle eine Liste song mit Tonfrequenzen und spiele die Melodie ab. Mit for f in reversed(song): kannst du die Töne in umgekehrten Reihenfolge abspielen. |
2) | Spiele alle 12 Tonfrequenzen einer c'' - c''' Oktave (inklusive Halbtöne) und zeichne dazu immer grössere Quadrate. Spiele dann die Töne in der umgekehrten Reihenfolge (zuerst den höchsten Ton) und zeichne dazu rote Quadrate (zuerst das grösste Quadrat). |
3) | Ändere das Beispiel 4 so, dass bei den weissen und schwarzen Tasten die Notennamen statt Frequenzen gegeben werden. Dann kannst du in der Funktion playTone() auch das Instrument wählen. |