Alle Befehle des Telefons zum Nachschlagen, in Ruby, Python und JavaScript, die Stimmungen zum Anhören, eigene Aufnahmen statt Thorstens Stimme und wie Thorsten ein Wort richtig ausspricht. Wie alles zusammenspielt, zeigt die Aktivität »Ein Spiel am Telefon«; fertige Spiele stehen im Telefonbuch.
Ein Telefonspiel ist ein gewöhnliches Programm in Ruby, Python oder JavaScript. Seine erste Zeile holt die Befehle des Telefons; in Python und JavaScript nennt sie jeden Befehl, den das Spiel benutzt.
| Ruby | Python | JavaScript | |
|---|---|---|---|
| Die erste Zeile | require 'telefon' |
from telefon import keys, music, say, sleep |
const { keys, music, say, sleep } = require('telefon'); |
Im Terminal, im Ordner deines Spiels:
telefon spiel.rb
Das Terminal nennt eine Adresse; sie steht auch im Reiter »Ports« bei Port
8040. Im Browser ruft ein Klick auf den grünen Hörer an. Jeder Anruf startet
das Programm neu aus der Datei, eine Änderung hörst du also beim nächsten
Anruf. Sobald telefon läuft, holt es die Musik deines Spiels und bereitet
seine festen Sätze vor; im Terminal steht, wann beides bereit ist. Beenden
mit StrgC.
Ohne Telefon und ohne Ton spielt --test das Spiel durch, mit festen Tasten
für jedes keys, durch Kommas getrennt, - für keine Taste:
telefon --test --keys 1,2 spiel.rb
Jede Zeile der Ausgabe ist ein Ereignis: Telefon: für einen Satz, Tasten:
für die Tasten, Musik:, Pause: und am Schluss Ende: mit dem Grund. So
prüfen auch die Aufgaben dein Spiel.
| Ruby | Python | JavaScript | |
|---|---|---|---|
| Etwas sagen | say 'Hallo!' |
say('Hallo!') |
say('Hallo!'); |
| … mit einer Taste abzubrechen | say '…', interrupt: true |
say('…', interrupt=True) |
say('…', { interrupt: true }); |
| … in einer Stimmung | say '…', mood: 'whisper' |
say('…', mood='whisper') |
say('…', { mood: 'whisper' }); |
| Eine eigene Aufnahme abspielen | play 'eingang.mp3' |
play('eingang.mp3') |
play('eingang.mp3'); |
| Auf eine Taste warten | key = keys(1) |
key = keys(1) |
const key = keys(1); |
| Auf bis zu drei Tasten, 5 Sekunden je Taste | code = keys(3, timeout: 5) |
code = keys(3, timeout=5) |
const code = keys(3, 5); |
| Musik von YouTube | music 'https://…' |
music('https://…') |
music('https://…'); |
| Musik aus einer Datei | music 'hoehle.mp3' |
music('hoehle.mp3') |
music('hoehle.mp3'); |
| Leiser | music '…', volume: 0.3 |
music('…', 0.3) |
music('…', 0.3); |
| Nur ein Ausschnitt | music '…', start: '1:15', stop: '1:52' |
music('…', start='1:15', stop='1:52') |
music('…', { start: '1:15', stop: '1:52' }); |
| Musik aus | music nil |
music(None) |
music(null); |
| Warten | sleep 3 |
sleep(3) |
sleep(3); |
| Auflegen | hangup |
hangup() |
hangup(); |
| Der Name des Spiels | title 'Die Höhle' |
title('Die Höhle') |
title('Die Höhle'); |
| Ein Satz fürs Telefonbuch | subtitle '…' |
subtitle('…') |
subtitle('…'); |
say sagt einen Text und kehrt erst zurück, wenn er gesprochen ist; dann
läuft das Programm weiter. Ein langer Text wird Satz für Satz gesprochen.
Eine Taste, die jemand drückt, während das Spiel spricht, geht nicht
verloren: Sie wartet auf das nächste keys. Den Satz muss man trotzdem bis
zum Ende hören, außer er hat interrupt: Dann bricht er bei der ersten Taste
ab, und das nächste keys bekommt genau diese Taste. Das passt zu Sätzen, die
man beim zweiten Mal schon kennt.
Ein Satz, in den das Programm erst beim Anruf etwas einsetzt
("#{punkte} Punkte" in Ruby, f'{punkte} Punkte' in Python), wird erst dann
gemacht; wer anruft, wartet einen Moment. Die anderen Sätze desselben say
sind vorbereitet.
keys(1) wartet auf eine Taste und gibt sie als Text zurück: '1', nicht die
Zahl 1. Vergleiche darum mit '1' in Anführungszeichen (in JavaScript mit
===). Drückt zehn Sekunden lang niemand etwas, gibt keys einen leeren Text
zurück, ''.
keys(3) wartet auf bis zu drei Tasten und gibt sie zusammen zurück, etwa
'472'. Kommen weniger, gibt es nach der Wartezeit zurück, was da ist.# beendet eine Eingabe früher und steht nie im Ergebnis. Der
Stern kommt als '*' zurück.keys gedrückt wurden, während das Spiel noch sprach,
zählen mit.music spielt Musik in einer Schleife, bis das Spiel zu Ende ist oder ein
neues music sie ersetzt. Solange Thorsten spricht, wird sie leiser. Die
Quelle ist ein Link zu YouTube, von dem das Telefon nur den Ton nimmt, oder
eine Datei im Ordner des Spiels.
music einen Fehler, denn beim
Veröffentlichen käme sie nicht mit. MP3 und WAV spielt jeder Browser, Ogg
und M4A nicht jeder; das Telefon spielt alle vier.Von einem Video holt der Workspace einmal den Ton und hebt ihn auf; von
einem sehr langen Video nur das Stück ab start, höchstens zehn Minuten.
Die Lautstärke liegt zwischen 0 und 1, ohne Angabe 1.
start und stop spielen nur einen Ausschnitt, in Sekunden (75) oder als
'1:15'; der Ausschnitt wiederholt sich. Ohne stop geht es ab start
weiter. Ein Link aus »Teilen« bei YouTube mit t=75 beginnt ebenfalls dort.
music wartet, bis die Musik läuft. Beim ersten Mal holt der Workspace das
Video; telefon holt es schon beim Start.
Ohne Quelle schaltet music die Musik aus: music nil in Ruby,
music(None) in Python, music(null) in JavaScript.
sleep wartet so viele Sekunden, wie du angibst. Die Musik spielt weiter, und
Tasten, die währenddessen gedrückt werden, warten auf das nächste keys.
In Python kommt sleep aus telefon, nicht aus time: from time import
sleep hielte das Programm an, ohne dass das Telefon davon weiß.
Ein Anruf endet, wenn das Programm zu Ende ist. hangup legt sofort auf, egal
in welcher Funktion das Spiel gerade ist; danach läuft nichts mehr, und auf
dem Telefon ertönt das Besetztzeichen.
title gibt dem Spiel seinen Namen: Das Telefon zeigt ihn an, sobald das
Spiel ihn sagt, und im Telefonbuch steht er. subtitle ist ein Satz, der im
Telefonbuch unter dem Namen steht. Beides gehört an den Anfang der Datei;
eingereicht werden kann ein Spiel erst mit beiden.
Thorsten kann einen Satz in acht Stimmungen sagen; hör sie dir an, jede mit einem Satz, der zu ihr passt:
Die Sätze mit Stimmung spricht eine zweite Stimme von Thorsten, die etwas weniger klar klingt als die gewohnte. Setz Stimmungen darum sparsam ein, dort, wo sie etwas erzählen: Ein einziges Flüstern im dunklen Gang wirkt stärker als zehn.
Statt Thorsten kann auch deine eigene Stimme sprechen, ein Geräusch erklingen
oder eine Melodie, die du gesummt hast. Nimm sie auf, leg sie als MP3 in den
Ordner deines Spiels (WAV, Ogg und M4A gehen auch, wie bei
music), und play spielt sie ab, wie say einen Satz sagt: Die
Musik wird leiser, das Spiel wartet, bis die Aufnahme zu Ende ist, und mit
interrupt bricht eine Taste sie ab.
| Ruby | Python | JavaScript | |
|---|---|---|---|
| Abspielen | play 'eingang.mp3' |
play('eingang.mp3') |
play('eingang.mp3'); |
| … mit einer Taste abzubrechen | play 'eingang.mp3', interrupt: true |
play('eingang.mp3', interrupt=True) |
play('eingang.mp3', { interrupt: true }); |
Aufnehmen kannst du am Computer mit Audacity,
das nichts kostet: aufnehmen, dann »Datei«, »Exportieren«, »Als MP3
exportieren«. Eine Aufnahme vom Handy öffnet Audacity ebenso und speichert sie
als MP3. Die Datei ziehst du in VS Code in den Ordner telefon. Auf der Seite
des Telefons steht an ihrer Stelle ihr Name neben einem Mikrofon.
Reichst du dein Spiel ein, kommen die Aufnahmen mit ins Telefonbuch, und dort kann sie jeder hören. Nimm darum nur auf, was alle hören dürfen, und die Stimme von jemand anderem nur, wenn die Person einverstanden ist.
Thorsten liest alles, was in say steht, wie einen deutschen Text. Meistens
klingt das richtig. Bei Zahlen, Abkürzungen und englischen Wörtern lohnt es
sich, genau hinzuhören:
| Im Text | Thorsten sagt | So klingt es anders |
|---|---|---|
Raum 123 |
»Raum hundertdreiundzwanzig« |
Raum 1 2 3: »Raum eins zwei drei« |
ZDF |
»Zett De Eff«: Abkürzungen buchstabiert er | |
Psst, Hm, Brr
|
den Laut, nicht die Buchstaben | |
Game Over |
»Gahme Ohver«, deutsch gelesen | [[ ɡˈeɪm ]] over |
Ein Komma macht eine kurze Pause, ein Punkt, ein Fragezeichen oder ein
Ausrufezeichen eine längere. Zwischen zwei doppelten eckigen Klammern steht
Lautschrift, das Internationale Phonetische Alphabet (IPA): Dann spricht
Thorsten genau diese Laute. Das Zeichen ˈ steht vor der betonten Silbe, ː
macht den Laut davor lang. Meist reicht es, nur das Wort in Lautschrift zu
schreiben, das falsch klingt: »over« spricht Thorsten so, wie man es auf
Deutsch meistens sagt.
Leider verloren. [[ ɡˈeɪm ]] over!
Die Lautschrift eines Wortes steht im Wiktionary unter »Aussprache«, bei englischen Wörtern im englischen Wiktionary. Die Zeichen kopierst du von dort. Auf der Seite des Telefons steht die Lautschrift ohne die Klammern.