Hanging Tree – Musik mit dem Arduino

Ferien: Endlich hat man mal wieder Zeit für sich und seine vielen Arduinoprojekte. Ein Glück gingen mir die Ideen bis heute nicht aus, auch wenn sie anderen total nutzlos erscheinen, was sie vielleicht auch sind. Mein heutiges Projekt: Das Lied Hanging Tree aus der Filmmusik von Die Tribute von Panem – Mockingjay (Teil 1) für den Arduino. Klingt am Ende wie ein Gameboy-Remake des Liedes, Spaß gemacht hat es trotzdem, und es war auch kompliziert genug, um darüber ein Tutorial zu schreiben

Ein Hinweis jedoch vorweg: Das Lied entstammt natürlich nicht meiner Fantasie. Die Rechte dafür liegen immer noch bei James Newton Howard und Republic (Universal Music).

Was benötigt man?

  • Ein Piezolautsprecher
  • Ein Arduinoboard
  • Zwei Kabel
  • Viel Geduld, wenn ihr nicht Copy&Paste benutzen wollt, dazu Noten

Wie wird der Versuch aufgebaut?

Hier ein Fritzing-Sketch:

Fritzing SketchWo spielt die Musik?

Die Softwaregrundlagen könnt ihr auf dieser Seite nachlesen. Im Grunde wird auf dem Pin, an dem der Piezolautsprecher angeschlossen ist, eine elektronische Welle mit einer bestimmten Frequenz angelegt, die die Membran des Lautsprechers zum Schwingen bringt. Musikalische Noten kann man in diese Frequenzen in Hz umrechnen, sodass wir Musik mit dem Arduino machen können. Diese Frequenzen benötigen wir beim Programmieren, glücklicherweise hat uns das Arduino-Team die Umrechnung abgenommen. Auf der oben verlinkten Seite könnt ihr den Inhalt einer pitches.h-Datei erlesen, die wir wie eine Library installieren und in unser Sketch importieren. Ich habe diese nochmal hierher kopiert und ihr könnt Sie am Ende dieses Beitrages downloaden:

Danach kommt die eigentliche Programmierung. Ich selbst habe lediglich den Sketch, der ebenfalls auf arduino.cc zu finden ist, ein wenig angepasst:

Beim Erstellen des Sketches hatte ich die meiste Arbeit. Da anscheinend niemand vor mir vorhatte, dieses Lied auf einem Arduino zu spielen, musste ich selbst meine Notenkenntnisse aus dem Musikunterricht anwenden, mir Noten im Netz suchen und die 89 Noten inkl. deren Werten korrekt niederschreiben. Ich hoffe es ist mir gelungen. Die von mir benutzten Noten stammen von hier.

Anmerkung zu punktierten Noten

In den Noten fallen einige punktierte Viertelnoten auf, die ich im Sketch mit 2.66 als Wert deklariert habe. Der mathematische Grund: Die im Sketch genannten Tonwerte sind das Reziproke der musikalischen Tonwerte. Eine Halbe Note (1/2) entspricht im Sketch 2, usw. Eine punktierte Viertelnote hat musikalisch den Wert (1/4 + 1/8) = 3/8. Im Sketch deshalb normalerweise 8/3 bzw. 2,66. Ich habe habe den halben Wert 1,33 benutzt, da er IMHO besser klingt.

Sketch, Pitches und Example zum Download

Ich habe mal aufgenommen, was mein Arduino fabriziert hat. Ihr könnt euch das Ergebnis anhören, indem ihr die .mp3-Datei herunterladet. Außerdem findet ihr den Sketch und die pitches.h. Letztere installiert ihr, indem ihr einen pitches Ordner in den Libraries erstellt und diese dann hineinkopiert. So könnt ihr sie projektübergreifend nutzen.

2 Kommentare:

  1. Hallo. Muss man den oben genannten Code mit den vielen define Befehlen über den eigentlichen Song kopieren oder muss der in ein eigenen „Tab“. Falls ja bitte um Erklärung.
    LG Maxim

    1. Hallo Maxim,

      herzlichen Dank für deine Frage!
      Die Syntax
      #define NOTE_A7 3520 sagt erstmal nur aus, dass beim Kompilieren überall das NOTE_A7 durch 3520 übersetzt wird. Das vereinfacht die Programmierung, da du nicht mit Zahlen hantieren musst, sondern den Notennamen nutzen kannst. Dafür werden, da dies vor der Kompilierung passiert, kein Variablenspeicher belegt.

      #define-Anweisungen kannst du zu Beginn deines Sketches einfügen. Da da allerdings viel Bildschirmplatz verschwendet wird, habe ich diese in eine andere Datei ausgelagert. Dafür erstellt man einfach eine Datei mit der Dateiendung .h, schreibst seine Anweisungen hinein und inkludiert diese mit der Anweisung #include in den Hauptsketch. #define-Anweisungen sind ebenfalls eine Anweisung, die vor der Kompilierung durchgeführt werden. Dabei wird quasi der Dateiinhalt von datei.h in den Hauptsketch kopiert. Auch dies vereinfacht die Programmierung und Übersichtlichkeit, ohne Performanceeinbußen auf dem Arduino.

      Ich empfehle dir den Wikipediaartikel zu C-Präprozessoren anzuschauen, falls dich #define– und #include-Anweisungen interessieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.