image: teaser.webp image_alt: "Das Telefon im Browser während eines Anrufs bei der Höhle: links ein Telefon mit Display, Tastenfeld und rotem Hörer zum Auflegen; rechts das Gespräch, die Sätze des Spiels in Blasen" kind: reference

Telefonspiel

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.

1. Ein Spiel starten

Die erste Zeile

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');

Der Befehl 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.

2. Alle Befehle

Auf einen Blick

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

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

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.
  • Die Wartezeit gilt für jede Taste neu; die zweite Zahl ändert sie, in Sekunden.
  • Die Raute # beendet eine Eingabe früher und steht nie im Ergebnis. Der Stern kommt als '*' zurück.
  • Tasten, die vor keys gedrückt wurden, während das Spiel noch sprach, zählen mit.

music

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.

  • Eine Datei ist MP3, WAV, Ogg oder M4A und liegt direkt neben dem Spiel, nicht in einem Unterordner; sonst gibt 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.
  • Ins Telefonbuch kommt eine Datei bis 20 MB, alle zusammen bis 40 MB.
  • 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 und hangup

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 und subtitle

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.

3. Stimmungen

Alle acht zum Anhören

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.

4. Eigene Aufnahmen

play

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.

5. Aussprache

Wie Thorsten liest

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.

6. Zum Nachschlagen