Hinweis: Dieses Projekt benötigt Version 3 von MakeCode, welche hier verfügbar ist: https://makecode.calliope.cc/v3 .
Mit dem Mikrofon des Calliope mini kann man nicht nur die Lautstärke messen, sondern sogar richtige Tonaufnahmen machen! Das ist ziemlich cool, wir sind damit allerdings nicht unbedingt die ersten:
Der Drucker und Buchhändler Édouard-Léon Scott de Martinville hat es mit seinem "Phonautographen" schon 1857 geschafft, Schall sichtbar zu machen: Wenn jemand in den Trichter des Gerätes sprach, vibrierte eine daran befestigte Schweineborste und zeichnete so ein Bild des Schalls auf einen rußgeschwärzten Zylinder, den man per Hand weiterkurbeln konnte:
Das Blöde war: Es gab noch keine Möglichkeit, das Ergebnis abzuspielen, dafür war das Gerät schlichtweg nicht gedacht. Erst 2008 gelang Forschern die digitale Rekonstruktion einer Aufzeichnung aus dem Jahr 1860, so dass wir im folgenden Video mit dem französischen Volkslied "Au clair de la lune" die älteste bekannte Aufnahme menschlicher Stimme hören können. Die Bedeutung dieser Erfindung wird noch eindrücklicher, wenn man bedenkt, wie viele Jahrtausende Menschheitsgeschichte davor für uns unhörbar geblieben sind!
Unsere Aufnahmen werden qualitativ nicht viel besser klingen als im Video, aber ist es nicht toll, den Pioniergeist von damals heute nochmal neu erleben zu können?
Wer direkt loslegen will, kann unten weiterlesen, dort wo die MakeCode-Erweiterung erklärt ist, erfährt dann aber nicht, was eigentlich passiert (das bleibt dann "Zauberei", was andererseits ja auch irgendwie nett ist) und verpasst die Möglichkeit, schon oft gehörte Begriffe wie "Samplingrate" nachvollziehen zu können :-)
Hier also der technische Teil: Wenn wir mit dem Calliope Schall aufzeichnen wollen, müssen wir erstmal wissen, was passiert, wenn wir in das eingebaute Mikrofon sprechen. Unsere Sprache versetzt dort eine winzige Membran in Schwingung, so wie die Borste im Phonautographen angefangen hat zu vibrieren, wenn man in den Trichter gesprochen hat, nur dass beim Calliope nichts auf eine Walze gezeichnet wird. Was wir bekommen, wenn wir den Mikrofon-Pin abfragen, ist die aktuelle Position dieser Membran, aber in Form einer Zahl zwischen 0 und 1023. Bei einem Wert von ca. 512 ist die Membran in der Mitte, bei höheren Werten ist sie in die eine Richtung ausgelenkt, bei niedrigeren in die andere Richtung.
Wenn man also den Mikrofon-Pin in kurzen Abständen immer wieder abfragt, bekommt man einen Verlauf der Schwingung als Folge von Zahlen. Allerdings etwas gröber als im Original, weil es 1. immer einen kurzen zeitlichen Abstand gibt, bis wir den nächsten Wert abfragen können (dazwischen sind wir quasi "taub") und 2. nur 1024 unterschiedliche Positionen der Membran erkennbar sind. Die werden wir auch noch auf 256 "herunterrechnen", um Speicherplatz zu sparen (1 Byte pro Messung). Aber das reicht, um Sprache gut erkennbar aufzuzeichnen.
Jede einzelne Messung nennt man ein "Sample" (also eine "Probe"). Der Abstand zwischen zwei Messungen ist das so genannte "Samplingintervall". Je kürzer dieses ist, desto genauer ist logischerweise die Aufzeichnung, aber desto größer ist auch der Speicherbedarf.
Ein Samplingintervall von 500 µs (also 0, 0005 s, was schon extrem grob ist) bedeutet, dass wir in einer Sekunde 1 / 0, 0005 = 2000 Werte bekommen (man sagt auch: die "Samplingrate" beträgt 2 kHz). Die Aufnahmedauer beträgt demnach bei den 6000 Byte Arbeitsspeicher, die wir dafür im Calliope freischaufeln können, 3 Sekunden. Wenn das Intervall halb so lang ist (250 µs), sind es doppelt so viele Messwerte pro Sekunde (also 4000; Samplingrate 4 kHz), d. h. wir können nur noch 1, 5 Sekunden aufnehmen. Das klingt wenig, aber 6000 Byte sind nicht viel. Bei einer Audio-CD wären sie bereits nach 3 hundertstel Sekunden verbraucht. D. h. wir reduzieren hier die Datenmenge auf bis zu 1 % der CD-Qualität! Klar, dass man das hört. Erstaunlich eigentlich, dass es überhaupt funktioniert! ;-) In der unten verlinkten MakeCode-Erweiterung sind beide genannten Einstellungen möglich.
Und so funktioniert die Wiedergabe: Wir gehen einfach die 6000 Samples in dem selben zeitlichen Abstand wie bei der Aufnahme der Reihe nach durch und schreiben den jeweiligen Wert auf einen der beiden Analog-Pins (P1 oder P2). (Genauer gesagt multiplizieren wir jedes Sample vorher noch mit 4, um trotz der nur 256 unterschiedlichen Werte pro Sample, wir hatten hierfür ja 1 Byte genommen, wenigstens den maximalen Wertebereich der Analog-Pins von 1024 auszuschöpfen).
Was man dann noch machen muss: einen kleinen Lautsprecher oder Kopfhörer zwischen den Minus-Pin des Calliope und den gewählten Ausgabepin klemmen. Das versetzt dessen Membran in die selbe Schwingung, die wir beim Mikrofon gemessen haben, so dass wir den selben Schall hören, den wir aufgenommen haben (nur eben etwas vergröbert). Und das konnte der Phonautograph nicht ;-) Achtung: Beim Kopfhörer muss man den Minus-Pin mit dem Kontakt an der Spitze verbinden, den Analog-Pin mit einem der beiden anderen Kontakte (der Ton kommt dann entweder aus dem rechten oder dem linken Kopfhörer). In jedem Fall gilt: Den Kopfhörer bitte nicht direkt ans Ohr halten, und definitiv nicht ins Ohr stecken, das wäre zu laut! Das ist die Verkabelung:
Das Verfahren, mit dem die Analog-Pins aus den Werten von 0 bis 1023 unterschiedliche Spannungen zwischen 0 V und 3, 3 V machen, erzeugt leider ein hochfrequentes Nebengeräusch, das sich in der Form nicht vermeiden lässt. Das ist auch ein Grund, weshalb wir nicht den eingebauten Lautsprecher des Calliope nehmen, denn abgesehen davon, dass er sich mit MakeCode nicht so wie wir es brauchen ansteuern lässt, hört man da fast nur das Nebengeräusch, die eigentliche Aufnahme ist sehr leise. Das betrifft allerdings nur die Wiedergabe über die Analog-Pins! Wenn man die Aufnahme auf den PC exportiert und dort abspielt, was mit der Erweiterung auch möglich ist, hat man diesen Effekt nicht!
Dies ist der Link zur MakeCode-Erweiterung "Audio-Recorder" mit Blöcken zur Aufnahme, Wiedergabe und dem Senden von Tonaufnahmen an den PC oder an einen anderen Calliope:
https://github.com/kimmeskamp/pxt-audiorecorder
Um die Erweiterung zu importieren, muss man in MakeCode nur auf das Zahnrad oben rechts klicken, dann "Erweiterungen" wählen und die oben genannte URL eingeben.
Und hier die Erklärung am Beispiel das angehängten Demo-Programms:
Zu Beginn muss man zwingend angeben, auf welchem Pin die Aufnahme abgespielt werden soll, wahlweise einen der beiden Analog-Pins P1 oder P2. Dieser wird dann entsprechend konfiguriert. Außerdem kann man die Sampling-Rate angeben; die Voreinstellung, wenn man das nicht macht, ist 2 kHz.
Für die Aufnahme gibt es den Block "starte Aufnahme" (hier ausgeführt nach dem Drücken der Taste A, inkl. Rechteck im Display während die Aufnahme läuft). Die Aufnahme hört automatisch nach 3 Sek. (bei einer Samplingrate von 2 kHz) bzw. 1, 5 Sek. (bei einer Samplingrate von 4 kHz) auf:
Für die Wiedergabe gibt des den Block: "spiele Aufnahme ab" (hier verknüpft mit Taste B, während der Wiedergabe erscheint eine Achtelnote im Display):
Und für das Speichern der Aufnahme "sende Aufnahme seriell" (hier verknüpft mit Taste A+B, während des Exports erscheint ein Pfeil nach rechts im Display):
Diese Funktion erlaubt es, die Aufnahme auf den PC zu überspielen und dort als WAV- oder mp3-Datei zu speichern. Und das geht so:
Benötigt werden zwei Programme. Die so genannte "Arduino-IDE" und "Audacity", beide kostenlos:
https://www.arduino.cc/en/software/
Für den Export sind folgende Schritte erforderlich: Nachdem man das Demo-Programm auf den Calliope kopiert hat, in der Arduino-IDE nachsehen, mit welchem "COM-Port" der Calliope verbunden ist und diesen auswählen (Menüpunkt "Werkzeuge/Port"). Dann den Seriellen Monitor öffnen (ebenfalls im Menü "Werkzeuge") und unten rechts als Baud-Rate 115200 wählen. Anschließend mit dem Calliope die Aufnahme machen und mit A+B auf den PC übertragen. Im Seriellen Monitor sollten jetzt viele Zeilen mit Zahlen durchrauschen. Das sind die einzelnen Samples, nur umgerechnet vom Wertebereich von 0 bis 255 auf den Wertebereich von -1 bis 1, also als Kommazahlen, denn das ist die für Audacity benötigte Darstellung:
Wir markieren die gesamte Ausgabe mit Strg+A und kopieren sie mit Strg+C in die Zwischenablage. Dann öffnen wir den in Windows enthaltenen Texteditor und fügen mit Strg+V den Inhalt der Zwischenablage ein. Wenn in der ersten Zeile komische Zeichen als Artefakte vom Beginn der Übertragung stehen, müssen wir diese löschen. Die Datei speichern wir an einem Ort unserer Wahl, z. B. als "meine_aufnahme.txt"
Dann starten wir Audacity. Mit dem Menüpunkt "Werkzeuge/Sample-Datenimport" importieren wir unsere Aufnahme in dem wir die gespeicherte Textdatei auswählen. Sie erscheint dann als Audiospur:
Wir klicken auf das Drop-Down-Menü der Audiospur (die Schaltfläche mit dem Pfeil nach unten) und wählen "Rate -> Andere..." tippen 2000 oder 4000 ein (je nachdem was wir in MakeCode gewählt hatten) und bestätigen.
Wir können uns jetzt mit einem Klick auf die Play-Schaltfläche die Aufnahme anhören! Oder mit "Datei/Exportieren/Als mp3 exportieren" sogar eine Datei erzeugen, die unsere Aufnahme verewigt und sich mit anderen teilen lässt!
Noch cooler ist es aber, die Aufnahme per Funk an einen anderen Calliope zu schicken und ihn so zum Walkie-Talkie zu machen!
Auch diese Funktion ist im Demo-Programm mit den Tasten A+B verknüpft, aber in JavaScript auskommentiert. Wenn man mit den Blöcken arbeitet, muss man nur den Block "sende Aufnahme seriell" löschen und an die selbe Stelle den Block "sende Aufnahme über Funk" ziehen.
Wenn man dann A+B gleichzeitig drückt, wird die Aufnahme an einen anderen Calliope (auf dem auch das Demo-Programm laufen muss) geschickt. Er empfängt sie automatisch und zeigt dabei einen Pfeil nach links an. Anschließend kann man sie auch auf dem Gerät mit der Taste B abspielen. So bekommt man zwei Calliopes und zwei Paar Kopfhörern zwei Funkgeräte! Und das sieht dann so aus:
Viel Spaß beim Ausprobieren :-)
Thorsten Kimmeskamp
PS: Das Projekt basiert auf dem Sound-Recorder in C von Burkhard Kainka: https://www.elektronik-labor.de/Microbit/Calliope10.html
Comments