Gordons Projects

--> Projects Top-Level GIT

Initial GIT submission
[pibrella] / tune.c
1 /*
2  * tune.c:
3  *      Play a tune using the Pibrella buzzer
4  *
5  * Copyright (c) 2014 Gordon Henderson. <projects@drogon.net>
6  ***********************************************************************
7  *    This is free software: you can redistribute it and/or modify
8  *    it under the terms of the GNU Lesser General Public License as published by
9  *    the Free Software Foundation, either version 3 of the License, or
10  *    (at your option) any later version.
11  *
12  *    This is distributed in the hope that it will be useful,
13  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *    GNU Lesser General Public License for more details.
16  *
17  *    You should have received a copy of the GNU Lesser General Public License
18  *    along with This.  If not, see <http://www.gnu.org/licenses/>.
19  ***********************************************************************
20  */
21
22 #include <stdio.h>
23 #include <unistd.h>
24 #include <errno.h>
25 #include <string.h>
26 #include <math.h>
27
28 #include <wiringPi.h>
29
30 #include "pibrella.h"
31
32 // Beats per minute
33
34 #define TEMPO   120
35 #define MS_PER_BEAT     ((1000*60/TEMPO)/4)
36
37 // Simple scale frequencies
38
39 static const int scale [8] = { 262, 294, 330, 349, 392, 440, 494, 525 } ;
40
41 // Our tune: Note followed by duration in quarter crotchets
42
43 const int tune [] = 
44 {
45   0,6, 1,2, 2,6, 0,2,           // Doe, a deer, a
46    2,4, 0,4, 2,8,               //   fe - male deer,
47   1,6, 2,2, 3,2, 3,2, 2,2, 1,2, // ray, a drop of gold-en
48    3,14, -1,2,                  //   sun.
49   2,6, 3,2, 4,6, 2,2,           // Me, a name I
50    4,4, 2,4, 4,8,               //   call my - self
51   3,6, 4,2, 5,2, 5,2, 4,2, 3,2, // Far, a long, long way to
52     5, 16,                      //  run.
53   4,6, 0,2, 1,2, 2,2, 3,2, 4,2, // Sew, a nee - dle pull - ing
54     5,14, -1,2,                 // thread
55   5,6, 1,2, 2,2, 3,2, 4,2, 5,2, // La, a note to fol - low
56    6,14, -1,2,                  //  so.
57   6,6, 2,2, 3,2, 4,2, 5,2, 6,2, // Tea, a drink with jam and
58    7,12, -1,4,                  //  bread
59   6,2, 6,2, 5,4, 4,4, 6,4, 4,4, // that will bring us back to
60   7,4, 4,4, 2,4, 1,4,           // do, oh, oh, oh!
61   
62   -1, 16, -1, -1
63 } ;
64
65
66 /*
67  * main:
68  *********************************************************************************
69  */
70
71 int main (void)
72 {
73   int note, dur ;
74   int i ;
75
76   wiringPiSetup () ;
77   pibrellaSetup () ;
78
79 // Play the tune
80
81   for (i = 0 ;; i += 2)
82   {
83     note = tune [i] ;
84     dur  = tune [i + 1] ;
85     if ((note == -1) && (dur == -1))
86       break ;
87
88     if (note == -1)     // Pause
89       printf ("Rest  ") ;
90     else
91     {
92       printf ("Note: %d  ", note) ;
93       playTone (scale [note]) ;
94     }
95
96 // Delay for the note duration
97
98     printf ("Time: %4d\n", MS_PER_BEAT * dur) ;
99     delay (MS_PER_BEAT * dur - 5) ;
100
101 // Stop sound for a few mS between notes
102
103     playTone (0) ;
104     delay    (5) ;
105   }
106
107   return 0 ;
108 }