Als Last-Minute-Projekt zur Weihnachtszeit hier nun ein Vorschlag: Baut Euch doch schnell noch einen kleinen Pieper für Adventslieder zusammen.
Ein ATmega8, ATmega88 oder ein anderer vorhandener Mikrocontroller und ein Piezo-Buzzer und schon geht es los.
Die Grundidee stammt von dieser Application Note auf der Herstellerseite.
Der Charme des Programms ist, dass Lieder als "Noten" eingegeben werden. Dadurch kann man auch relativ leicht, eigene Lieder eingeben und abspielen lassen. Vielleicht für die Kinder ...
Drei weihnachtliche Beispiele habe ich eingefügt.
Im Programm wird für jeden abzuspielenden Ton ein SOUND-Befehl zusamengebaut.
Alles anzeigen
Viel Spaß!
Ein ATmega8, ATmega88 oder ein anderer vorhandener Mikrocontroller und ein Piezo-Buzzer und schon geht es los.
Die Grundidee stammt von dieser Application Note auf der Herstellerseite.
Der Charme des Programms ist, dass Lieder als "Noten" eingegeben werden. Dadurch kann man auch relativ leicht, eigene Lieder eingeben und abspielen lassen. Vielleicht für die Kinder ...
Drei weihnachtliche Beispiele habe ich eingefügt.
Im Programm wird für jeden abzuspielenden Ton ein SOUND-Befehl zusamengebaut.
BASCOM-Quellcode
- ' BASCOM-Programm
- ' stefanhamburg in bascomforum.de
- ' Musik nach Noten: Weihnachtslieder
- ' Tonerzeugung mit SOUND-Befehl
- ' In: Taster an D.2, D.3 und D.4 fuer Melodienwahl
- ' Out: PortB.1 fuer Speaker
- '
- '$regfile = "M8def.dat"
- '$regfile = "M88def.dat"
- $regfile = "m8adef.dat" 'Chip festlegen
- $crystal = 1000000
- Const Crystal_in_khz = 1000 'Crystal in kHz
- $hwstack = 40
- $swstack = 40
- $framesize = 60
- Config Portd = Input 'Eingaben: Taster
- Portd = &B11111111 'Pullups
- Taster1 Alias Pind.2
- Taster2 Alias Pind.3
- Taster3 Alias Pind.4
- Config Pinb.1 = Output 'Buzzer ohne Elektronik an B.1
- Speaker Alias Portb.1
- Dim Duration As Word
- Dim Pulses As Word
- Dim Lied As String * 254
- Dim Laenge As Byte
- Dim Position As Byte
- Dim Zeichen As String * 1
- Dim Note As String * 5
- Dim Noten_laenge_str As String * 2
- Dim Noten_laenge As Byte
- Dim T_dauer As Long
- Dim Temp As Single
- Gosub Oh_du_froehliche
- Do
- If Taster1 = 0 Then Gosub Stille_nacht
- If Taster2 = 0 Then Gosub Jingle_bells
- If Taster3 = 0 Then Gosub Oh_du_froehliche
- Loop
- End
- 'Die Noten als Strings eingeben:
- 'Ein Lied kann beliebig auf mehrere Strings aufgeteilt werden.
- 'Ein String darf die Laenge 254 nicht ueberschreiten!!
- 'Hilfsskala um sicherzustellen, dass ein String nicht zu lang wird:
- ' 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234
- ' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 x <-Maximum
- Stille_nacht:
- Lied = "G2(1/4) G2(1/8) A2(1/8) G2(1/4) E2(1/2) E2(1/4) G2(1/4) G2(1/8) A2(1/8) G2(1/4) E2(1/2) E2(1/4)"
- Gosub Abspielen
- Lied = "D3(1/2) D3(1/4) H2(1/2) H2(1/4) C3(1/2) C3(1/4) G2(1/2) G2(1/4)"
- Gosub Abspielen
- '2. Zeile:
- Lied = "A2(1/2) A2(1/4) C3(1/4) C3(1/8) H2(1/8) A2(1/4) G2(1/4) G2(1/8) A2(1/8) G2(1/4) E2(1/2) E2(1/4)"
- Gosub Abspielen
- Lied = "A2(1/2) A2(1/4) C3(1/4) C3(1/8) H2(1/8) A2(1/4) G2(1/4) G2(1/8) A2(1/8) G2(1/4) E2(1/2) P(1/8)"
- Gosub Abspielen
- '3. Zeile:
- Lied = "D3(1/2) D3(1/4) F3(1/4) F3(1/8) D3(1/8) H2(1/4) C3(1/2) C3(1/4) E3(1/2) P(1/8)"
- Gosub Abspielen
- Lied = "C3(1/4) C3(1/8) G2(1/8) E2(1/4) G2(1/4) G2(1/8) F2(1/8) D2(1/4) C2(1/2) C2(1/4) C2(1/2)"
- Gosub Abspielen
- Return
- Jingle_bells:
- Lied = "E2(1/4) E2(1/4) E2(1/2) P(1/16) E2(1/4) E2(1/4) E2(1/2) P(1/16) E2(1/4) G2(1/4) C2(1/4) D2(1/4) E2(1/1)"
- Gosub Abspielen
- Lied = "F2(1/4) F2(1/4) F2(1/4) F2(1/4) P(1/16) F2(1/4) E2(1/4) E2(1/4) E2(1/8) E2(1/8) P(1/16) E(1/4) D2(1/4) D2(1/4) E2(1/4) P(1/16) D2(1/2) G2(1/2)"
- Gosub Abspielen
- Lied = "E2(1/4) E2(1/4) E2(1/2) P(1/16) E2(1/4) E2(1/4) E2(1/2) P(1/16) E2(1/4) G2(1/4) C2(1/4) D2(1/4) E2(1/1)"
- Gosub Abspielen
- Lied = "F2(1/4) F2(1/4) F2(1/4) F2(1/4) P(1/16) F2(1/4) E2(1/4) E2(1/4) E2(1/8) E2(1/8) P(1/16) G2(1/4) G2(1/4) F2(1/4) D2(1/4) C2(1/1)"
- Gosub Abspielen
- Return
- Oh_du_froehliche:
- Lied = "G2(1/2) A2(1/2) G2(1/4) G2(1/8) F2(1/8) E2(1/4) F2(1/4) G2(1/2) A2(1/2) G2(1/4) G2(1/8) F2(1/8) E2(1/4) F2(1/4)"
- Gosub Abspielen
- Lied = "G2(1/2) G2(1/2) A2(1/2) H2(1/4) C3(1/4) H2(1/2) A2(1/2) G2(1/1) D2(1/4) D2(1/8) E2(1/8) D(1/4) E(1/4)"
- Gosub Abspielen
- Lied = "F2(1/4) F2(1/8) G2(1/8) F2(1/2) E2(1/4) E2(1/8) F2(1/8) E2(1/4) F2(1/4) G2(1/4) G2(1/8) A2(1/8) G2(1/2)"
- Gosub Abspielen
- Lied = "C3(1/4) H2(1/4) A2(1/4) G2(1/4) C3(1/4) A2(1/4) G2(1/4) F2(1/4) E2(1/2) D2(1/2) C2(1/2)"
- Gosub Abspielen
- Return
- '----------------------------------------------------
- Abspielen:
- Laenge = Len(lied)
- Position = 1
- Do
- Note = "" 'Notenhoehe einlesen
- Zeichen = Mid(lied , Position , 1)
- While Zeichen <> "("
- Note = Note + Zeichen
- Incr Position
- Zeichen = Mid(lied , Position , 1)
- Wend
- Position = Position + 3 'bis '/' vorruecken 'and position <laenge
- Noten_laenge_str = "" 'Notenlaenge einlesen
- Zeichen = Mid(lied , Position , 1)
- While Zeichen <> ")"
- Noten_laenge_str = Noten_laenge_str + Zeichen
- Incr Position
- Zeichen = Mid(lied , Position , 1)
- Wend
- Position = Position + 2 ' ) und Leerzeichen ueberspringen
- 'SOUND_Befehl zusammenbauen
- Select Case Note
- Case "C2" : Pulses = 159
- Case "Cis2" : Pulses = 150
- Case "D2" : Pulses = 141
- Case "Dis2" : Pulses = 133
- Case "E2" : Pulses = 126
- Case "F2" : Pulses = 119
- Case "Fis2" : Pulses = 112
- Case "G2" : Pulses = 106
- Case "Gis2" : Pulses = 100
- Case "A2" : Pulses = 94
- Case "Ais2" : Pulses = 89
- Case "B2" : Pulses = 84
- Case "H2" : Pulses = 84
- Case "C3" : Pulses = 79
- Case "Cis3" : Pulses = 75
- Case "D3" : Pulses = 70
- Case "Dis3" : Pulses = 66
- Case "E3" : Pulses = 63
- Case "F3" : Pulses = 59
- End Select
- Noten_laenge = Val(noten_laenge_str)
- Select Case Noten_laenge
- Case 32 : T_dauer = 63
- Case 16 : T_dauer = 125
- Case 8 : T_dauer = 250
- Case 4 : T_dauer = 500
- Case 2 : T_dauer = 1000
- Case 1 : T_dauer = 2000
- End Select
- T_dauer = T_dauer * Crystal_in_khz
- Temp = 12 * Pulses
- Temp = T_dauer / Temp
- Duration = Temp
- If Note = "P" Then
- Select Case Noten_laenge
- Case 32 : Waitms 63 'Pause oder ..
- Case 16 : Waitms 125
- Case 8 : Waitms 250
- Case 4 : Waitms 500
- Case 2 : Wait 1
- Case 1 : Wait 2
- End Select
- Else
- Sound Speaker , Duration , Pulses '..Ton abspielen
- End If
- Loop Until Position >= Laenge 'bis ein String zu Ende
- Return
- '---------------------------------------------------------------------------------------
Viel Spaß!