/**************************************************************************** * apps/examples/audio_rttl/audio_rttl.cxx * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include #include "audio_rttl.h" /**************************************************************************** * Private Types ****************************************************************************/ /* Note - note freq on octave 1 */ #define C 16.35 #define CD 17.32 #define D 18.35 #define DE 19.45 #define E 20.60 #define F 21.83 #define FG 23.12 #define G 24.50 #define A 27.50 #define AB 29.14 #define B 30.84 /* Octave - base freq multiplier for the base freq */ #define OCT2 4 #define OCT3 8 #define OCT4 16 #define OCT5 32 #define OCT6 64 #define OCT7 128 #define OCT8 256 /**************************************************************************** * Public Functions ****************************************************************************/ extern "C" int main(int argc, FAR char *argv[]) { int freq; float base_freq; char temp_note; int octave; int duration; int note_duration; int base_duration; int bpm; int cnt; /* Set I/O parameters for power on. */ if (!board_audio_power_control(true)) { printf("Error: board_audio_power_control() failure.\n"); return 1; } printf("Start Audio RTTL player\n"); bpm = 0; octave = 0; base_duration = 0; note_duration = 0; while (*g_song != ':') { g_song++; } g_song++; if (*g_song == 'd') { g_song = g_song + 2; base_duration = *g_song - '0'; g_song++; if ((*g_song >= '0') && (*g_song <= '9')) { base_duration = (base_duration * 10) + (*g_song - '0'); g_song++; } g_song++; } if (*g_song == 'o') { g_song = g_song + 2; octave = *g_song - '0'; g_song = g_song + 2; } if (octave == 2) { octave = OCT2; } else if (octave == 3) { octave = OCT3; } else if (octave == 4) { octave = OCT4; } else if (octave == 5) { octave = OCT5; } else if (octave == 6) { octave = OCT6; } else if (octave == 7) { octave = OCT7; } else if (octave == 8) { octave = OCT8; } if (*g_song == 'b') { g_song = g_song + 2; bpm = 0; for (cnt = 1; cnt <= 3; cnt++) { if (*g_song != ':') { bpm = bpm * 10 + (*g_song - '0'); g_song++; } } g_song++; } do { if ((*g_song >= '0') && (*g_song <= '9')) { note_duration = *g_song - '0'; g_song++; } if ((*g_song >= '0') && (*g_song <= '9')) { note_duration = (note_duration * 10) + (*g_song - '0'); g_song++; } if (note_duration > 0) { duration = ((60 * 1000L / bpm) * 4) / note_duration; } else { duration = ((60 * 1000L / bpm) * 4) / base_duration; } base_freq = 0; temp_note = ' '; switch (*g_song) { case 'c': { temp_note = 'c'; base_freq = C; break; } case 'd': { temp_note = 'd'; base_freq = D; break; } case 'e': { temp_note = 'e'; base_freq = E; break; } case 'f': { temp_note = 'f'; base_freq = F; break; } case 'g': { temp_note = 'g'; base_freq = G; break; } case 'a': { temp_note = 'a'; base_freq = A; break; } case 'b': { temp_note = 'b'; base_freq = B; break; } case 'p': { temp_note = 'p'; break; } default: break; } g_song++; if (*g_song == '.') { duration += duration / 2; g_song++; } if (*g_song == '#') { if (temp_note == 'c') { base_freq = CD; } if (temp_note == 'd') { base_freq = DE; } if (temp_note == 'f') { base_freq = FG; } if (temp_note == 'a') { base_freq = AB; } g_song++; } if ((*g_song - '0') == '2') { octave = OCT2; } if ((*g_song - '0') == '3') { octave = OCT3; } if ((*g_song - '0') == '4') { octave = OCT4; } if ((*g_song - '0') == '5') { octave = OCT5; } if ((*g_song - '0') == '6') { octave = OCT6; } if ((*g_song - '0') == '7') { octave = OCT7; } if ((*g_song - '0') == '8') { octave = OCT8; } g_song++; if (*g_song == ',') { g_song++; } /* play the sound */ freq = ceil(base_freq * octave); if (!board_audio_tone_generator(1, -40, freq)) { break; } usleep(duration * 1000L); } while (*g_song); /* Sound off. */ if (!board_audio_tone_generator(0, 0, 0)) { printf("Error: board_audio_tone_generator() failure.\n"); return 1; } /* Set I/O parameters for power off. */ if (!board_audio_power_control(false)) { printf("Error: board_audio_power_control() failure.\n"); return 1; } printf("Done.\n"); return 0; }