Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

1 - Frequenzen und Töne

  • Weitere Vorschläge zum Thema mit den Boards: Arduino UNO - Prop-BoE - Prop-AB - Raspberry Pi

Nahezu alle elektronischen Signaltöne werden von Mikrocontrollern, die mit einem Lautsprecher verbunden sind, aufgebaut. Der Controller erzeugt den Ton durch das schnelle Aussenden von HIGH/LOW Signalen. Die Anzahl der gesendeten HIGH/LOW Signale pro Sekunde bezeichnen wir als Frequenz, sie bestimmt die Tonhöhe des Signaltons. Jedesmal, wenn sich ein HIGH/LOW Signal wiederholt, sprechen wir von einer Schwingung, die Zeit, die dabei vergeht, wird als Schwingungsdauer bezeichnet. Die Anzahl der Schwingungen pro Sekunde wird in der Einheit Hertz angegeben und mit Hz abgekürzt. Eine der am häufigsten eingesetzten Warnfrequenzen bei Geräten liegt bei 2 kHz. Das heißt, dass sich die HIGH/LOW Signale 2000 mal pro Sekunden wiederholen.

 

Mikrokontroller, Lautsprecher und HIGH/LOW Signale

Fast alle Geräusche und Töne, die man heute täglich hören kann, werden von Mikrokontrollern erzeugt. Dazu sendet dieser kleine Baustein sehr schnell hintereinander HIGH/LOW Signale aus, die vom Lautsprecher in Töne umgesetzt werden.

Die Anzahl der HIGH und LOW Signale pro Zeiteinheit bezeichnet man auch als Frequenz; sie bestimmt die Tonhöhe. Die Zeit, in der ein HIGH/LOW Signal sich wiederholt wird auch Periode genannt. Die Anzahl der Perioden pro Sekunde wird in der Einheit Hertz (Hz) angegeben.

 

Beispiel

Von Maschinen werden Warn-Signaltöne häufig mit einer Frequenz von 2kHz abgegeben. Das heißt, dass die HIGH/LOW Signale sich 2000-mal pro Sekunde wiederholen.

Der Piezolautsprecher

In diesem Kapitel beschäftigen wir uns ausschließlich mit dem kleinen und sehr kostengünstigen Piezoelektrischen-Lautsprecher oder kurz: Piezo-Lautsprecher. Die Bauteilzeichnung und das Schaltsymbol zeigt Abb. 8.1.

Abbildung 8.1 Piezoelektrischer Lautsprecher - Courtesy of Parallax Inc.

2 - Aufbau und Test eines Piezos

Material

1x  Board of Education

1x  Piezolautsprecher

2x  Steckdraht

Aufgabe

Bau die Schaltung aus Abbildung 8.2 auf.

Gib in den BASIC Stamp Editor das Programm 8_1.bs2 ein und speicher es ab.

Starte das Programm und überprüfe, ob ein Ton zu hören ist.

Achte beim Schaltungsaufbau auf die Hinweismarkierung auf dem Lautsprecher und darauf, dass der Minus-Pol des Lautsprechers mit Vss und der Plus-Pol mit P9 verbunden wird.

Abbildung 8.2 Schaltungsaufbau mit Piezolautsprecher - Courtesy of Parallax Inc.

Das Programm 8_1.bs2

Programm 8_1.bs2

Wie arbeitet das Programm 8_1.bs2?

Mit Hilfe des Befehls FREQOUT lassen sich sehr einfach HIGH/LOW Signale an einen Lautsprecher übertragen. Die Syntax für diesen Befehl lautet:

  • FREQOUT Pin, Dauer, Freq1 {Freq2}
    

Pin bezeichnet den I/O Pin der BASIC Stamp, über den der Ton ausgegeben wird.

Dauer beschreibt, wie lange ein Ton, in Millisekunden gemessen, stehen soll.

Freq1 legt die Frequenz den auszugebenden Tons in der Einheit Hz fest.  

Freq2 ist optional und ermöglicht die Ausgabe eines zweiten Tones einer anderen Frequenz.

 

Für die Ausgabe eines Tones von 1,5s Dauer mit einer Frequenz von 2kHz am Pin9 der BASIC Stamp genügt die Programmzeile:

  • FREQOUT 9, 1500, 2000
    

Jetzt kommst du!

Speicher das Programm 8_1.bs2 über FILE - SAVE AS ... unter dem neuen Namen 8_1a ab.

Verändere die Werte von Dauer und Freq1 und starte jedesmal das Programm neu.

Wenn der Wert von Freq1 erhöht wird, nimmt die Tonhöhe dann zu oder ab? Gib für freq1 folgende Werte ein: 1500, 2000, 2500, 3000.

3 - Action Sound

Viele Spielzeuge enthalten heute Mikrokontroller über die sogenannte Action Sounds abgegeben werden. Es sind sich schnell verändernde Tonfolgen, die über den Lautsprecher ausgegeben werden. Einige interessante Effekt erzielt man auch dadurch, dass man zwei unterschiedliche Töne erzeugt. Beide Methoden werden wir jetzt kennenlernen.

Einen Action Sound programmieren

Ein Action Sound setzt sich aus drei Komponenten zusammen:

  • Pause
    
    Dauer
    
    Frequenz
    

Die Pause ist die Zeit zwischen den Tönen; sie wird über den Befehl PAUSE erzeugt.

Die Dauer gibt die Tonlänge an, die über den Befehl FREQOUT und die Variable Dauer eingestellt wird. Die Frequenz bestimmt die Höhe eines Tones. Je höher die Frequenz, desto höher der Ton und umgekehrt. Eingestellt wird sie über die Variable Freq1 ebenfalls im Befehl FREQOUT.

Programmbeispiel ActionSound.bs2

In diesem Beispiel werden unterschiedliche Kombinationen von Pause, Tonlänge und Frequenz vorgestellt. Die erste Tonsequenz klingt ähnlich einem elektronischen Alarm, die zweite ähnelt einer Roboterstimme aus einem Sci-Fi Film und die dritte könnte ein Soundeffekt von einem alten Videospiel sein.

Aufgabe
  • Gib das Programm ActionSound.bs2 in den BASIC Stamp Editor ein und speicher es ab.
  • Starte das Programm.
Programm ActionSound.bs2

Wie arbeitet das Programm ActionSound.bs2?

Die Alarm-Routine hört sich wie ein Wecker oder so an. Es werden Töne mit einer Frequenz von 1,5 kHz, einer Dauer von 0,5 Sekunden und einer Pause von 0,5 Sekunden ausgegeben. Die Roboter Routine arbeitet mit unterschiedlichen Frequenzen und kurzen Tonlängen. 

Die Hyperspace Routine verwendet keine Pausen, variiert aber sowohl die Tonlänge als auch die Frequenz. Durch die Verwendung von FOR…NEXT Schleifen, die für eine schnelle Änderung von Frequenz und Tonlänge verantwortlich sind, enstehen einige interessante Soundeffekte.

 

In der ersten, der äußeren FOR...NEXT  Schleife startet die Variable dauer  mit dem Wert 15, die folgende innere Schleife überträgt dann die Frequenzen 2000, 2020, 2040 bis 2500 an den Piezoschallwandler. Ist die innere Schleife abgearbeitet, wird in der äußeren Schleife die Laufvariable dauer um eins erniedrigt und die innere Schleife erneut durchlaufen; insgesamt wiederholt sich dieser Vorgang 15 mal.

4 - Geschachtelte Schleifen

Programmbeispiel: GeschachtelteSchleifen.bs2

Um besser verstehen zu können, wie geschachtelte FOR…NEXT Schleifen arbeiten, enthält  das Programm GeschachtelteSchleifen.bs2 einen DEBUG Befehl, der die Indexwerte einer einfachen geschachtelten Schleife anzeigt. 

Aufgabe
  • Gib das Programm GeschachtelteSchleifen.bs2 in den Stamp Editor ein und speicher es anschließend ab.
  • Starte das Programm.
  • Beobachte die Ausgabe im Debug Terminal und überprüfe, wie die Argumente von Tondauer (dauer) und Frequenz (frequenz) sich bei jedem Schleifendurchlauf ändern.
Programm GeschachtelteSchleifen.bs2

Jetzt kommst du!  – Mehr Soundeffekte

Es gibt beliebig viele Möglichkeiten das Programm ActionSound.bs2 zu verändern, und unterschiedliche Soundkombinationen zu erhalten. Das folgende Beispiel zeigt eine Änderung der Hyperraum Routine:

  • DEBUG "Hyperraum Sprung...", CR
    FOR dauer = 15 TO 1 STEP 3
           FOR frequenz = 2000 TO 2500 STEP 15
                  FREQOUT 9, duration, frequency 
           NEXT
    NEXT
    FOR dauer = 1 TO 36 STEP 3
            FOR frequenz = 2500 TO 2000 STEP 15
                   FREQOUT 9, duration, frequency
        NEXT
    NEXT
    

Ändere das Programm ActionSound.bs2 wie oben beschrieben ab und speichere es unter dem Namen ActionSound2.bs2 ab.

Viel Spaß mit dieser Modifikation und weiteren, die du nach eigenen Vorstellungen entwickelst.

5 - Zwei Frequenzen mischen

Es lassen sich auch zwei Frequenzen gleichzeitig ausgeben. Im Audiobereich spricht man von mixing oder mischen. Erinnere dich an die Syntax des Befehls FREQOUT in Übung 1:

  • FREQOUT Pin, Dauer, Freq1 {, Freq2}
    

Über das optionale Argument Freq2 im Befehl FREQOUT lassen sich zwei Frequenzen mischen. Für die Frequenzen 2 kHz und 3 kHz sieht ein Programmaufruf wie folgt aus:

  • FREQOUT 9, 1000, 2000, 3000
    

Programmbeispiel: ToeneMischen.bs2

Dieses Beispielprogramm zeigt was passiert, wenn ein 2 kHz und ein 3 kHz Ton miteinander gemischt werden. Liegen die beiden Frequenzen der zu mischenden Töne sehr eng beieinander, tritt ein interessantes Phänomen auf, das die Physiker Schwebung nennen. Werden zum Beispiel ein 2000 Hz und ein 2001 Hz Ton überlagert, wird der resultierende Ton mit einer Frequenz von 1 Hz an- und abschwellen. Bei der Überlagerung zweier Töne von 2000 Hz und 2002 Hz ergibt sich entsprechend eine Schwebung von 2 Hz.

Aufgabe
  • Gib das Programm ToeneMischen.bs2 in den Editor ein und speichere es ab.
  • Starte das Programm ToeneMischen.bs2.
  • Beobachte das Debug Terminal während die Töne abgespielt werden und beachte die unterschiedlichen Effekte, die bei der Überlagerung der unterschiedlichen Töne auftreten.

Das Programm ToeneMischen.bs2

Jetzt kommst du! – Speicherplatzsparend programmieren

ToeneMischen.bs2 hat uns gezeigt, was passiert, wenn zwei akustische Wellen unterschiedlicher Frequenz mit Hilfe des Arguments Freq2 im Befehl FREQOUT überlagert werden. Dieses Programmierverfahren ist allerdings sehr unwirtschaftlich.

 

  • Ändere das Programm ToeneMischen.bs2 so ab, dass mit Hilfe einer Schleife das Argument Freq2 die Werte 2001 bis 2005 durchläuft. Deklariere dazu eine Variable vom Typ Word.

6 - Noten und einfache Songs programmieren

Abb. 8.3 zeigt den Ausschnitt von 25 Tasten einer Klaviertastatur. Dort sind ebenfalls die Frequenzen angegeben, mit der jede Saite schwingt, sobald sie angeschlagen wird. Die Tasten und die entsprechenden Noten sind mit C6 bis C8 bezeichnet. Jeweils 12 Tasten, 8 weiße und 4 schwarze, bilden eine Gruppe und umfassen eine Oktave. Die Notenfolge wiederholt sich nach jeweils 12 Tasten. Noten gleicher Bezeichnung haben dieselbe Frequenz; mit jeder Oktave verdoppelt sich die Frequenz. C7 hat beispielsweise eine doppelt so hohe Frequenz wie C6, C8 eine doppelt so hohe wie C7. Umgekehrt ist die Frequenz von A6 halb so groß wie die von A7.

 

Beim Einsingen solmisieren Sänger häufig das bekannte Do Re Mi Fa So La Ti Do, eine Ganztonfolge, die auf dem Klavier mit den weißen Tasten nachgespielt werden kann; die schwarzen Tasten geben Halbtöne wieder. Die schwarze Taste zwischen den Tasten C und D ist zum Beispiel für den Ton Cis(C#) oder Des(Db) zuständig. Wenn du mehr über die hier nur sehr kurz angeschnittene Musiktheorie erfahren möchtest, wende dich bitte an deinen Musiklehrer.

Abbildung 8.3 Klaviertasten (Ausschnitt) und die zugehörigen Frequenzen - Courtesy of Parallax Inc.

7 - Notenprogrammierung

Der Befehl FREQOUT ist zum Schreiben von Noten gut geeignet. Um über den an einer BASIC Stamp angeschlossenen Piezoschallwandler Musik abzuspielen, gilt es eine Reihe von Regeln zu beachten, die genau so auch beim Spielen eines Musikinstrumentes eingehalten werden müssen. Diese Regeln beziehen sich auf die Größen: Frequenz, Tondauer und Pause. Im folgenden Beispielprogramm werden einige Noten, jede mit einer Tonlänge von einer halben Sekunde, über den Schallwandler abgespielt.

Programmbeispiel: DoReMiFaSolLaTiDo.bs2

Aufgabe

Gib das Programm DoReMiFaSol.bs2 in den Editor ein und speichere es ab.

Starte das Programm.

Orientiere dich an den Frequenzen in Abb. 8.3 und füge in das Programm die fünf fehlenden Halbtöne ein.

Ändere das Programm so ab, dass es auch die folgende Oktave spielt. Tipp: Erleichtere dir die Arbeit dadurch, dass du den Operator *2 bei jedem freq1 Argument einsetzt.

Beispiel: FREQOUT 9, 500, 1175 * 2 ergibt D7, die Note D in der 7. Oktave

Programm DoReMiFaSol.bs2

Notenfolgen speichern und zurückladen

Das EEPROM auf dem BASIC Stamp Modul eignet sich gut zum Speichern von Noten. Wir wissen bereits, dass das mit Hilfe des Befehls WRITE erfolgt; einfacher geht es über die Direktive DATA. Die Syntax der DATA Direktive lautet:

  • {Symbol} DATA {Word} DataItem {, {Word} DataItem, … }
    

Im folgenden Beispiel wird gezeigt, wie die DATA Direktive aufgerufen wird, um Zeichen, die entsprechenden Noten zugewiesen sind, zu speichern.

  • Notes DATA "C","C","G","G","A","A","G"
    

Mit dem READ Befehl wird auf die Zeichen zugegriffen. Der Buchstabe ‘C’ befindet sich an der Adresse Notes + 0 ein zweiter Buchstabe ‘C’ an der Adresse Notes + 1. Der Buchstabe ‘G’ befindet sich bei Notes + 2 und so weiter. Wenn zum Beispiel der letzte Buchstabe ‘G’ in eine Variable noteLetter vom Typ Byte geladen werden soll, lautet der Befehl:

  • READ Notes + 6, noteLetter
    

Mit Hilfe der DATA Direktive lassen sich auch ganze Zahlenlisten speichern. Frequenzangaben und Tondauern, die die BASIC Stamp zu jeder Note als weitere Informationen benötigt, müssen in Variablen vom Typ Word abgelegt werden, da ihre Werte im allgemeinen größer als 255 sind. Ein Beispiel zeigt die folgende Zeile: 

  • Frequencies DATA Word 2093, Word 2093, Word 3136, Word 3136,
    Word 3520, Word 3520, Word 3136
    

Jeder dieser Werte benötigt zwei Byte, deshalb unterscheidet sich der Zugriff auf Zahlen mit dem read Befehl von denen auf Zeichen. 2093 ist an der Adresse Frequencies + 0, 2093 aber bei Frequencies + 2 zu finden. Die erste Zahl 3136 befindet sich bei Frequencies + 4 und die zweite 3136 bei Frequencies + 6

In der folgenden FOR…NEXT Schleife werden die Notendaten in einer Variablen noteLetter abgelegt und anschließend die Frequenzdaten in der Variablen noteFreq

FOR index = 0 to 6  
  READ Notes + index, noteLetter
  READ Frequencies + (index * 2), Word noteFreq
  DEBUG noteLetter, "  ", DEC noteFreq, CR
NEXT

Im folgenden Programmbeispiel werden Noten und Notenlängen über DATA abgespeichert und mit Hilfe des Befehls FREQOUT jede Note mit ihrer spezifischen Frequenz- und Notenlängenangabe abgespielt. Das Ergebnis sind die ersten Takte aus dem amerikanischen Kinderlied Twinkle Twinkle Little Star.

Programmbeispiel  TwinkleTwinkle.bs2

Dieses Programmbeispiel zeigt, wie die DATA Direktive zum Abspeichern von Listen aufgerufen und wie mit dem Befehl READ auf die Werte in der Liste zugegriffen wird.

Aufgabe
  • Gib das Programm TwinkleTwinkle.bs2 in den Editor ein und speichere es ab.
  • Starte das Programm.
  • Überzeuge dich davon, dass die Noten das Lied Twinkle Twinkle Little Star wiedergeben.
  • Überprüfe auf dem Debug Terminal das das Programm wie vorgesehen arbeitet, indem es die Daten der drei DATA Direktiven jeweils anzeigt.

Das Programm TwinkleTwinkle.bs2

Programm TwinkleTwinkle.bs2

8 - Musik mit dem Mikrocontroller

Notenlängen werden auf Notenblättern nicht in der Einheit Millisekunden angegeben, sondern als ganze, halbe, viertel, achtel, sechzehntel usw. Note beschrieben. Wie der Name schon sagt, dauert eine halbe Note nur halb so lang, wie eine ganze Note. Entsprechendes kann für alle anderen Notenlängen gesagt werden. Wie lang wird nun aber eine ganze Note gespielt? Dies wiederum hängt vom Musikstück ab und wird über die Tempoangabe dem Musiker mitgeteilt. So kann es passieren, dass eine ganze Note in dem einen Stück vier Sekunden, in einem andern Stück aber nur zwei Sekunden dauert.

 

Pausen sind die Zeiten zwischen Noten, in denen kein Ton gespielt wird. Die Länge einer Pause wird auch als ganze, halbe, viertel, achtel, sechzehntel und zweiundreißigstel Pause mit jeweils einem eigenen Symbol angegeben.

Verbesserungen beim Speichern und Laden von Musik

Es lassen sich Programme schreiben, die doppelt so viel Musik in einer BASIC Stamp speichern, wenn mit dem Variablentyp Byte und nicht mit Word in den DATA Direktiven gearbeitet wird. Ein Programm kann aber auch so abgeändert werden, dass sich die Noten einfacher lesen lassen, indem man einige der gebräuchlichen Vereinbarungen für Noten und Notenlängen nutzt. In dieser Übung wollen wir zeigen, wie sich Informationen über Musik speichern lassen, die sich an das Konzept von Noten, Notenlängen und Pausen anlehnen. Dabei wird auch auf das Tempo eingegangen und in der folgenden Übung noch einmal aufgegriffen.

Die hier vorgestellten DATA Direktiven zeigen, wie Noten und Notenlängen für das folgende Beispielprogramm abgelegt werden. Beim Abspielen sollte das Lied Bruder Jakob zu hören sein. In der Noten DATA Direktive werden nur Noten gespeichert und über die Befehle LOOKUP und LOOKDOWN werden den einzelnen Noten die entsprechenden Frequenzen zugeordnet.

  • Noten        DATA    "C","D","E","C","C","D","E","C","E","F", "G","E","F","G","Q"
    
    Dauer        DATA      4,  4,  4,  4,  4,  4,  4,  4,  4,  4, 2,  4,  4,  2
    
    GanzeNote        CON     2000
    

Die erste Zahl in der Direktive Dauer DATA teilt dem Programm mit, wie lang die erste Note in der Direktive Noten DATA gespielt werden soll. Der zweite DATA Eintrag bei Dauer bezieht sich auf die zweite Note und so weiter. Die Notenlängen werden nicht in Millisekunden angegeben. Statt dessen sind es deutlich kleinere Zahlen, die im Format Byte abgelegt werden können und nicht mehr das Prefix Word in der DATA Direktive benötigen. Vergleicht man die Angaben in Millisekunden mit den hier vorliegenden, fällt auf, dass die hier benutzte Technik sich enger an die Nomenklatur für Notenlängenangaben hält. Die folgende Liste gibt die Entsprechungen von Zahlenwert zur notierten Notenlänge wieder.

  • 1 – ganze Note
  • 2 – halbe Note
  • 4 – viertel Note
  • 8 – achtel Note
  • 16 – sechzehntel Note
  • 32 – zweiunddreißigstel Note

Nachdem jeder Wert aus der Dauer DATA Direktive gelesen wurde, wird der anteilige GanzeNote Wert berechnet und damit der für den Befehl FREQOUT benötigte Wert der Variablen Dauer bestimmt. Die Notenlänge jeder Note hängt vom Tempo des Liedes ab. Je höher das Tempo, desto kürzer wird die Note gespielt, während bei einem langsameren Tempo jede Noten länger gehalten werden muss. Da alle Notenlängen Bruchteile einer ganzen Note sind, lässt sich die Notenlänge einer ganzen Note als Maß für das Tempo einsetzen.

Programmbeispiel  NotenUndDauer.bs2

Aufgabe

Gib das Programm NoteUndDauer.bs2 ein und speicher es anschließend ab.

Starte das Programm.

Wird das Lied Bruder Jakob gespielt?

Programm NotenUndDauer.bs2

Programm NotenUndDauer.bs2

Wie arbeitet das Programm NotenUndDauer.bs2?

Auf die Direktiven note DATA und dauer DATA sind wir weiter oben bereits eingegangen. Diese beiden und die Konstante GanzeNote genügen, um die Informationen aller Noten, die das Programm abspielt, zu speichern.

 

Auf die Deklaration der fünf Variablen des Programms wird weiter unten eingegangen. Obwohl für den Datenzugriff keine FOR…NEXT Schleife mehr benötigt wird, muss über eine Indexvariable index darüber gewacht werden, welche Daten in note und dauer jeweils eingelesen werden. Mit Hilfe der Variablen offset wird über die Befehle LOOKDOWN und LOOKUP ein bestimmter Wert ausgewählt. Die Variable noteBuchstabe speichert ein Zeichen, auf das über den READ Befehl zugegriffen wurde. Die Befehle LOOKUP und LOOKDOWN wandeln das jeweilige Zeichen in einen Frequenzwert um. Dieser Wert wird in der Variablen noteFreq abgelegt und als Argument Freq1 im Befehl FREQOUT aufgerufen. In die Variable noteDauer wird bei einem READ Befehl der ausgelesene Wert von dauer  DATA abgelegt. Über sie wird auch die Variable dauer im Befehl FREQOUT berechnet.

Die Hauptschleife wird solange durchlaufen, bis der Buchstabe ‘Q’ aus note DATA.ausgelesen wurde:

  • DO UNTIL noteBuchstabe = "Q"
    

Mit dem READ Befehl wird ein Zeichen aus note DATA ausgelesen und in der Variablen noteBuchstabe abgelegt. Sie bestimmt über den LOOKDOWN Befehl den Wert der Variablen offset. Erinnere dich daran, dass offset eine 1 enthält, wenn “b” erkannt wird, eine 2 wenn “B” und eine 3 wenn “C” erkannt wird. Mit diesem offset Wert wird dann über einen LOOKUP Befehl bestimmt, welchen Wert die Variable noteFreq annehmen soll. Bei einem offset von 1, nimmt noteFreq den Wert 1865, bei einem offset von 2, 1976 und bei einem offset von 3, 2093 an.

Die Notenfrequenzen sind damit bestimmt, es fehlen nur noch die Tonlängen. Der Befehl READ benutzt den Wert von index um einen Zahlenwert aus dauer DATA in noteDauer abzulegen.

In einem weiteren Schritt wird noteDauer gleichgesetzt mit der Konstanten GanzeNote dividiert durch noteDauer. Wird die Tonlänge nach Ausführung eines READ Befehls mit 4 ausgelesen, wird daraus 2000 ÷ 4 = 500. Ist noteDauer identisch 8, wird daraus 1500 ÷ 8 = 250.

Wenn noteDauer und noteFreq bestimmt sind, kann über den Befehl FREQOUT die Note gespielt werden.

Bei jedem Schleifendurchlauf des Hauptprogramms wird der Wert von index um eins erhöht. Startet das Hauptprogramm erneut, wird über die Variable index die nachfolgende Note eingelesen.

9 - Experimentieren mit Tempo und Melodie

 

Eine gespielte Notenlänge steht immer in direktem Bezug zum angegebenen Tempo. Das Tempo lässt sich über die Konstante GanzeNote verändern. Wird sie auf 2250 erhöht, nimmt das Tempo ab und das Lied wird langsamer gespielt. Wird sie auf 1750 erniedrigt, nimmt das Tempo zu und das Lied wird schneller abgespielt. 

 

  • Speicher NotenUndDauer.bs2 unter dem Namen ab: NotenUndDauer2.bs2.
  • Verändere das Tempo im neuen Programm durch Anpassung des Wertes von GanzeNote.  Wähle: 1500, 1750, 2000 und 2250.
  • Führe das Programm nach jeder Veränderung der Konstanten erneut aus und entscheide, welche Version am besten klingt.

 

Die Eingabe von Musikdaten gestaltet sich wesentlich einfacher, wenn nur Noten und Notenlängen eingegeben werden müssen. Im folgenden Beispiel werden die ersten acht Noten aus Beethovens 5. Symphony angegeben.

  • note  DATA "G","G","G","e","P","F","F","F","D","Q"
    
  • dauer DATA   8,  8,  8,  2,  8,  8,  8,  8,  2
    
  • GanzeNote CON   2000
    
Aufgabe
  • Speicher das so veränderte Programm unter Beethovens5.bs2.
  • Ersetze die Direktiven note DATA, dauer DATA und die Konstante GanzeNote durch die oben dargestellten Zeilen.
  • Führe das Programm aus. Hört es sich vertraut an?

10 - Punktierte Noten und weitere Merkmale

Das gerade abgeschlossene Beispielprogramm benötigte Noten, Notenlängen und Pausen. Das Tempo wurde über eine ganze Note bestimmt. Handys spielen Klingeltöne ab, die drei zusätzliche Merkmale aufweisen, auf die wir in den bisherigen Beispielen nicht eingegangen sind: 

 

  • Sie spielen punktierte Noten.
  • Sie bestimmen die Länge einer ganzen Note über einen Wert, der Tempo genannt wird.
  • Sie spielen Noten über mehr als nur eine Oktave.

 

Der Zusatz punktiert weist darauf hin, dass die Note um den halben Wert des angegebenen Notenwertes länger gespielt werden muss. Eine Tonlänge einer punktierten Viertelnote setzt sich zusammen aus dem Wert einer Viertelnote plus dem Wert einer Achtelnote. Eine punktierte halbe Note hat die Länge einer halben Note plus einer Viertelnote. Über eine entsprechende Datentabelle können alle punktierten und nicht punktierten Noten erfasst werden; im folgenden Beispiel steht die 0 für eine nicht punktierte und die 1 für eine punktierte Note:

  • punktiert             DATA      0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0, 0,  0,  0,  1,  0
    

Handys definieren typischerweise das Tempo für einen Song in Beats pro Minute; das ist mit der Aussage vergleichbar: Viertelnoten pro Minute. 

  • BeatsPerMin   CON  200
    

Abb. 8.5 ist eine Kopie der Abb. 8.3. Sie zeigt die 6. und 7. Oktave einer Klaviatur. Diese beiden Oktaven werden von einem Schallwandler am klarsten wiedergegeben. Es folgt ein Beispiel für eine DATA Direktive, die später benötigt wird, um Töne, die mehr als eine Oktave auseinander liegen,  spielen zu können.

  • Oktave          DATA      6,  7,  6,  6,  6,  6,  6,  6,  6,  7,  6, 6,  6,  6
    
Abbildung 8.4 - Courtesy of Parallax Inc.

Programmbeispiel: MusikPunktiert.bs2

Dieses Beispielprogramm spielt die ersten Noten aus dem Lied: For He’s a Jolly Good Fellow. Alle Noten werden in der 7. Oktave gespielt, einige von ihnen sind punktiert.

Aufgabe
  • Gib das Programm MusikPunktiert.bs2 in den Editor ein und speicher es ab.
  • Starte das Programm.
  • Zähle die Notenwerte und versuche die punktierten Noten herauszuhören.
  • Höre dir auch die Noten in der 7. Oktave an. Versuche mindestens eine dieser Noten in die 6. Oktave zu setzen. Die Veränderung bei der Tonwiedergabe wird sehr deutlich ausfallen.

Das Programm MusikPunktiert.bs2

Programm MusikPunktiert.bs2

Wie arbeitet das Programm MusikPunktiert.bs2?

Weiter unten siehst du die musikalischen Daten für das komplette Lied. Zu jeder Note in der Direktive note DATA gibt es einen korrespondierenden Eintrag in den Direktiven oktave, dauer und punktiert  DATA. Die erste Note ist zum Beispiel ein C in der 7. Oktave; es handelt sich um eine Viertelnote ohne Punktierung. Ein weiteres Beispiel: die zweitletzte Note (ohne das “Q”) ist ein E in der 7. Oktave. Es ist eine halbe punktierte Note. Es gibt zusätzlich die Konstante BeatsPerMin, die das Tempo dieses Liedes festlegt.

  • note            DATA    "C","E","E","E","D","E","F","E","E","D","D","D","C","D","E","C","Q"
    oktave        DATA      7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 7,  7,  7,  7,  7
    dauer          DATA      4,  2,  4,  4,  4,  4,  2,  2,  4,  2,  4, 4,  4,  4,  2,  2
    punktiert    DATA      0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,0,  0,  0,  1,  0
    BeatsPerMin      CON     320
    

 

Im vorherigen Beispielprogramm benutzten wir die Konstante ganzeNote. Dieses mal benutzen wir sie als Variable, in der die Notenlänge einer ganzen Note in ms abgelegt ist. Nachdem der Wert berechnet worden ist, werden über ganzeNote alle anderen Notenlängen bestimmt, wie schon im vorherigen Programm.

 

Die Variablen index, offset, noteBuchstabe und noteDauer werden in der gleichen Art wie im vorherigen Programm eingesetzt. Bei der Variablen noteFreq ist jetzt darauf zu achten, in welcher Oktave die jeweilige Note gespielt werden soll. Die Variablen noteOktave und notePunkt wurden hinzugefügt, um Oktavierungen und Punktierungen bearbeiten zu können.

 

Die Variable ganzeNote wird mit Hilfe von BeatsPerMin berechnet. Das Tempo des Liedes ist in Beats pro Minute angegeben; das Programm dividiert 60000ms durch BeatsPerMin und multipliziert das Ergebnis mit 4. Das Ergebnis gibt den Wert für eine ganze Note an. 

  • ganzeNote = 60000 / BeatsPerMin * 4
    

Die folgenden Programmzeilen 25 bis 29 werden wie im vorangegangenen Programm abgearbeitet.

Da die Noten jetzt unterschiedlich oktaviert sind, muss der Teil, in dem die Notenfrequenz bestimmt wird, geändert werden. Die Werte der LOOKUP Tabelle enthalten Frequenzen der 8. Oktave. Diese werden durch 1, 2, 4, 8 ... dividiert, wenn die zu spielenden Noten in der 8., 7., 6., 5., ... Oktave liegen. Als nächstes folgt die Division. Der Befehl LOOKUP legt zunächst eine Note der 8. Oktave in der Variablen noteFreq ab (Programmzeilen 30 - 32).

 

Es folgt die korrekte Oktavierung der Variablen noteFreq. Dazu holt sich der Befehl READ als erstes den in oktave DATA abgelegten Oktavwert; ein Wert zwischen 5 und 8 (Zeile 34).

Abhängig von der Oktave, wird noteFreq durch 1, 2, 4 oder 8 dividiert. Das Ziel ist die Division durch 20 = 1, 21 = 2, 22 = 4 oder 23 = 8. In der unten dargestellten Anweisung wird von der Zahl 8 der Wert von noteOktave (ein Wert zwischen 5 und 8) subtrahiert. War noteOctave vorher 8, so beträgt sein neuer Wert jetzt 0. War noteOctave vorher 7, so ist er neu 1 usw. (Zeile 35). 

Mit dieser Zwischenrechnung erhalten wir noteOktave Werte, die als Exponenten von 2 aufgefasst werden können.

11 - Wie lassen sich unter PBASIC Zahlen potenzieren?

Die Antwort lautet: Mit dem DCD Operator. DCD 0 ist 1, DCD 1 ist 2, DCD 2 ist 4 und DCD 3 ist 8.  Division von noteFreq durch DCD noteOktave bedeutet, dass durch 1, 2, 4 oder 8 geteilt und damit noteFreq auf den richtigen Frequenzwert, entsprechend der vorgegebenen Oktave, gesetzt wird.

 

Die ersten beiden Programmzeilen, die die Tonlänge bestimmen, gleichen den Programmzeilen des vorherigen Programmbeispiels. Neu ist hier, dass die Noten jetzt auch gepunktet sein können, das heißt, ihre Tonlänge erhöht sich um den Faktor 1,5. Mit dem Befehl READ greifen wir auf die mit der punktiert DATA Direktive im EEPROM abgespeicherten Werte zu. Über eine IF…THEN Anweisung wird immer dann, wenn der Werte der notePunkt Variable identisch 1 ist, mit 3 multipliziert und anschließend durch 2 geteilt (Zeile 38 ff).

Wenn du alle sieben Lektionen mit der BASIC Stamp in dieser Rubrik durchgearbeitet hast, sind deine Kenntnisse über die Hard- und Software hervorragend. Herzlichen Glückwunsch.

Jetzt hast du die Möglichkeit dich folgenden Themen zu widmen:

Diese Unterrichtsvorlagen sind entstanden in Anlehnung an die deutsche Übersetzung des Buches "What´s a Microcontroller?" Vers. 2.2 und 3.0 by Andy Lindsay, Parallax Inc., übersetzt und bearbeitet von Reinhard Rahner. BASIC Stamp, Board of Education, Homework Board sind eingetragene und geschützte Warenzeichen der Firma Parallax Inc.

Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf