Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Christmas tunes player (will play other tunes too!)
by Tom de Simone 8th Dec 2009
Get the circuit design and see it in action at http://meatfinish.wordpress.com/2010/12/12/arduino-christmas-tunes-player/
Inspired by the piezo circuit in the awesome oomlout beginner's guide for their Arduino Experimentation Kit (oomlout.com)
This code is licensed as Creative Commons share-alike (http://creativecommons.org/licenses/by-nc-sa/3.0/)
******** TODO: ********
- Make toggle button work better
- Redo note frequencies
Instructions
============
User selects 1 of 4 tunes to play by twisting a potentiometer and seeing a corresponding LED light up.
They then press the microswitch to play the selected tune.
If you just want to edit the melodies that are played, the only changes you need to make are in playTune(). This function works by calling parseTune()
with the following parameters:
char notes[]: a string that represents the notes of the song
int beatLength: how long a beat should be, which has a direct effect on tempo. Smaller value -> quicker; bigger -> slower
boolean loopSong: if true, the song will loop indefinitely (until you press the microswitch)
So in order to modify an existing tune, you basically have to modify the above 3 parameters in the call to parseTune();
Each tune is stored as a string of note names and their corresponding durations. Each token in the string can be represented
by the following regex:
([cdefgabCDEFGAB]#{0,1}[0-9]{1,2})|(,[0-9]{1,2})|\.
In other words, you can have a letter which represents the pitch (2 octaves possible: 'c' up to 'b', then 'C' up to 'B'),
followed by a '#' if it is a sharp (there are no flats in this grammar), and then a number representing its duration,
where 4 is a single beat (crotchet or 1/4 note), 2 is half a beat (quaver or 1/8 note), 8 is two beats (minim or 1/2 note) etc.
The duration can be any number from 1-99, but you'll rarely need longer than 16. If 1 (semiquaver or 1/16 note) really isn't
short enough for you, you could always increase the tempo ;)
To add a rest, use a comma (',') and then a number for the rest duration as above.
Finally, VERY IMPORTANT: EVERY tune you write should have a full stop/period ('.') as the last character in the string.
This tells the Arduino that the tune has finished.
For example, the following are all valid tokens:
c2 // play a 'C' note for a duration of 2 (equivalent to a quaver or 1/8 note)
a#4 // play an 'A#' note for a duration of 4 (equivalent to a crotchet or 1/4 note)
A#4 // play an 'A#' note an octave higher for a duration of 4 (equivalent to a crotchet or 1/4 note)
,8 // a minim (or 1/2 note) rest
The following are NOT valid tokens:
cBd // each of the 3 notes must be followed by a number representing its duration
,#6 // a rest cannot be "sharpened"
The following is a valid string representing a melody:
"e4d4c4d4e4e4e4,4d4d4d4,4e4g4g4,4."
The following is NOT a valid string representing a melody:
"e4d4c4d4e4e4e4,d4d4d4,4e4g4g4,4"
^ ^
because one of the rests is missing a duration value, and there is no full stop/period ('.') at the end of the string.
For more examples, look at the 4 melodies that are already written inside playTune() !

About

Play tunes through the piezo speaker on an Arduino

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - tomds/Arduino-Tunes: Play tunes through the piezo speaker on an Arduino · GitHub
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Christmas tunes player (will play other tunes too!)
by Tom de Simone 8th Dec 2009
Get the circuit design and see it in action at http://meatfinish.wordpress.com/2010/12/12/arduino-christmas-tunes-player/
Inspired by the piezo circuit in the awesome oomlout beginner's guide for their Arduino Experimentation Kit (oomlout.com)
This code is licensed as Creative Commons share-alike (http://creativecommons.org/licenses/by-nc-sa/3.0/)
******** TODO: ********
- Make toggle button work better
- Redo note frequencies
Instructions
============
User selects 1 of 4 tunes to play by twisting a potentiometer and seeing a corresponding LED light up.
They then press the microswitch to play the selected tune.
If you just want to edit the melodies that are played, the only changes you need to make are in playTune(). This function works by calling parseTune()
with the following parameters:
char notes[]: a string that represents the notes of the song
int beatLength: how long a beat should be, which has a direct effect on tempo. Smaller value -> quicker; bigger -> slower
boolean loopSong: if true, the song will loop indefinitely (until you press the microswitch)
So in order to modify an existing tune, you basically have to modify the above 3 parameters in the call to parseTune();
Each tune is stored as a string of note names and their corresponding durations. Each token in the string can be represented
by the following regex:
([cdefgabCDEFGAB]#{0,1}[0-9]{1,2})|(,[0-9]{1,2})|\.
In other words, you can have a letter which represents the pitch (2 octaves possible: 'c' up to 'b', then 'C' up to 'B'),
followed by a '#' if it is a sharp (there are no flats in this grammar), and then a number representing its duration,
where 4 is a single beat (crotchet or 1/4 note), 2 is half a beat (quaver or 1/8 note), 8 is two beats (minim or 1/2 note) etc.
The duration can be any number from 1-99, but you'll rarely need longer than 16. If 1 (semiquaver or 1/16 note) really isn't
short enough for you, you could always increase the tempo ;)
To add a rest, use a comma (',') and then a number for the rest duration as above.
Finally, VERY IMPORTANT: EVERY tune you write should have a full stop/period ('.') as the last character in the string.
This tells the Arduino that the tune has finished.
For example, the following are all valid tokens:
c2 // play a 'C' note for a duration of 2 (equivalent to a quaver or 1/8 note)
a#4 // play an 'A#' note for a duration of 4 (equivalent to a crotchet or 1/4 note)
A#4 // play an 'A#' note an octave higher for a duration of 4 (equivalent to a crotchet or 1/4 note)
,8 // a minim (or 1/2 note) rest
The following are NOT valid tokens:
cBd // each of the 3 notes must be followed by a number representing its duration
,#6 // a rest cannot be "sharpened"
The following is a valid string representing a melody:
"e4d4c4d4e4e4e4,4d4d4d4,4e4g4g4,4."
The following is NOT a valid string representing a melody:
"e4d4c4d4e4e4e4,d4d4d4,4e4g4g4,4"
^ ^
because one of the rests is missing a duration value, and there is no full stop/period ('.') at the end of the string.
For more examples, look at the 4 melodies that are already written inside playTune() !

About

Play tunes through the piezo speaker on an Arduino

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tomds/Arduino-Tunes: Play tunes through the piezo speaker on an Arduino · GitHub
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Christmas tunes player (will play other tunes too!)
by Tom de Simone 8th Dec 2009
Get the circuit design and see it in action at http://meatfinish.wordpress.com/2010/12/12/arduino-christmas-tunes-player/
Inspired by the piezo circuit in the awesome oomlout beginner's guide for their Arduino Experimentation Kit (oomlout.com)
This code is licensed as Creative Commons share-alike (http://creativecommons.org/licenses/by-nc-sa/3.0/)
******** TODO: ********
- Make toggle button work better
- Redo note frequencies
Instructions
============
User selects 1 of 4 tunes to play by twisting a potentiometer and seeing a corresponding LED light up.
They then press the microswitch to play the selected tune.
If you just want to edit the melodies that are played, the only changes you need to make are in playTune(). This function works by calling parseTune()
with the following parameters:
char notes[]: a string that represents the notes of the song
int beatLength: how long a beat should be, which has a direct effect on tempo. Smaller value -> quicker; bigger -> slower
boolean loopSong: if true, the song will loop indefinitely (until you press the microswitch)
So in order to modify an existing tune, you basically have to modify the above 3 parameters in the call to parseTune();
Each tune is stored as a string of note names and their corresponding durations. Each token in the string can be represented
by the following regex:
([cdefgabCDEFGAB]#{0,1}[0-9]{1,2})|(,[0-9]{1,2})|\.
In other words, you can have a letter which represents the pitch (2 octaves possible: 'c' up to 'b', then 'C' up to 'B'),
followed by a '#' if it is a sharp (there are no flats in this grammar), and then a number representing its duration,
where 4 is a single beat (crotchet or 1/4 note), 2 is half a beat (quaver or 1/8 note), 8 is two beats (minim or 1/2 note) etc.
The duration can be any number from 1-99, but you'll rarely need longer than 16. If 1 (semiquaver or 1/16 note) really isn't
short enough for you, you could always increase the tempo ;)
To add a rest, use a comma (',') and then a number for the rest duration as above.
Finally, VERY IMPORTANT: EVERY tune you write should have a full stop/period ('.') as the last character in the string.
This tells the Arduino that the tune has finished.
For example, the following are all valid tokens:
c2 // play a 'C' note for a duration of 2 (equivalent to a quaver or 1/8 note)
a#4 // play an 'A#' note for a duration of 4 (equivalent to a crotchet or 1/4 note)
A#4 // play an 'A#' note an octave higher for a duration of 4 (equivalent to a crotchet or 1/4 note)
,8 // a minim (or 1/2 note) rest
The following are NOT valid tokens:
cBd // each of the 3 notes must be followed by a number representing its duration
,#6 // a rest cannot be "sharpened"
The following is a valid string representing a melody:
"e4d4c4d4e4e4e4,4d4d4d4,4e4g4g4,4."
The following is NOT a valid string representing a melody:
"e4d4c4d4e4e4e4,d4d4d4,4e4g4g4,4"
^ ^
because one of the rests is missing a duration value, and there is no full stop/period ('.') at the end of the string.
For more examples, look at the 4 melodies that are already written inside playTune() !

About

Play tunes through the piezo speaker on an Arduino

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tomds/Arduino-Tunes: Play tunes through the piezo speaker on an Arduino · GitHub
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Christmas tunes player (will play other tunes too!)
by Tom de Simone 8th Dec 2009
Get the circuit design and see it in action at http://meatfinish.wordpress.com/2010/12/12/arduino-christmas-tunes-player/
Inspired by the piezo circuit in the awesome oomlout beginner's guide for their Arduino Experimentation Kit (oomlout.com)
This code is licensed as Creative Commons share-alike (http://creativecommons.org/licenses/by-nc-sa/3.0/)
******** TODO: ********
- Make toggle button work better
- Redo note frequencies
Instructions
============
User selects 1 of 4 tunes to play by twisting a potentiometer and seeing a corresponding LED light up.
They then press the microswitch to play the selected tune.
If you just want to edit the melodies that are played, the only changes you need to make are in playTune(). This function works by calling parseTune()
with the following parameters:
char notes[]: a string that represents the notes of the song
int beatLength: how long a beat should be, which has a direct effect on tempo. Smaller value -> quicker; bigger -> slower
boolean loopSong: if true, the song will loop indefinitely (until you press the microswitch)
So in order to modify an existing tune, you basically have to modify the above 3 parameters in the call to parseTune();
Each tune is stored as a string of note names and their corresponding durations. Each token in the string can be represented
by the following regex:
([cdefgabCDEFGAB]#{0,1}[0-9]{1,2})|(,[0-9]{1,2})|\.
In other words, you can have a letter which represents the pitch (2 octaves possible: 'c' up to 'b', then 'C' up to 'B'),
followed by a '#' if it is a sharp (there are no flats in this grammar), and then a number representing its duration,
where 4 is a single beat (crotchet or 1/4 note), 2 is half a beat (quaver or 1/8 note), 8 is two beats (minim or 1/2 note) etc.
The duration can be any number from 1-99, but you'll rarely need longer than 16. If 1 (semiquaver or 1/16 note) really isn't
short enough for you, you could always increase the tempo ;)
To add a rest, use a comma (',') and then a number for the rest duration as above.
Finally, VERY IMPORTANT: EVERY tune you write should have a full stop/period ('.') as the last character in the string.
This tells the Arduino that the tune has finished.
For example, the following are all valid tokens:
c2 // play a 'C' note for a duration of 2 (equivalent to a quaver or 1/8 note)
a#4 // play an 'A#' note for a duration of 4 (equivalent to a crotchet or 1/4 note)
A#4 // play an 'A#' note an octave higher for a duration of 4 (equivalent to a crotchet or 1/4 note)
,8 // a minim (or 1/2 note) rest
The following are NOT valid tokens:
cBd // each of the 3 notes must be followed by a number representing its duration
,#6 // a rest cannot be "sharpened"
The following is a valid string representing a melody:
"e4d4c4d4e4e4e4,4d4d4d4,4e4g4g4,4."
The following is NOT a valid string representing a melody:
"e4d4c4d4e4e4e4,d4d4d4,4e4g4g4,4"
^ ^
because one of the rests is missing a duration value, and there is no full stop/period ('.') at the end of the string.
For more examples, look at the 4 melodies that are already written inside playTune() !

About

Play tunes through the piezo speaker on an Arduino

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - tomds/Arduino-Tunes: Play tunes through the piezo speaker on an Arduino · GitHub
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Christmas tunes player (will play other tunes too!)
by Tom de Simone 8th Dec 2009
Get the circuit design and see it in action at http://meatfinish.wordpress.com/2010/12/12/arduino-christmas-tunes-player/
Inspired by the piezo circuit in the awesome oomlout beginner's guide for their Arduino Experimentation Kit (oomlout.com)
This code is licensed as Creative Commons share-alike (http://creativecommons.org/licenses/by-nc-sa/3.0/)
******** TODO: ********
- Make toggle button work better
- Redo note frequencies
Instructions
============
User selects 1 of 4 tunes to play by twisting a potentiometer and seeing a corresponding LED light up.
They then press the microswitch to play the selected tune.
If you just want to edit the melodies that are played, the only changes you need to make are in playTune(). This function works by calling parseTune()
with the following parameters:
char notes[]: a string that represents the notes of the song
int beatLength: how long a beat should be, which has a direct effect on tempo. Smaller value -> quicker; bigger -> slower
boolean loopSong: if true, the song will loop indefinitely (until you press the microswitch)
So in order to modify an existing tune, you basically have to modify the above 3 parameters in the call to parseTune();
Each tune is stored as a string of note names and their corresponding durations. Each token in the string can be represented
by the following regex:
([cdefgabCDEFGAB]#{0,1}[0-9]{1,2})|(,[0-9]{1,2})|\.
In other words, you can have a letter which represents the pitch (2 octaves possible: 'c' up to 'b', then 'C' up to 'B'),
followed by a '#' if it is a sharp (there are no flats in this grammar), and then a number representing its duration,
where 4 is a single beat (crotchet or 1/4 note), 2 is half a beat (quaver or 1/8 note), 8 is two beats (minim or 1/2 note) etc.
The duration can be any number from 1-99, but you'll rarely need longer than 16. If 1 (semiquaver or 1/16 note) really isn't
short enough for you, you could always increase the tempo ;)
To add a rest, use a comma (',') and then a number for the rest duration as above.
Finally, VERY IMPORTANT: EVERY tune you write should have a full stop/period ('.') as the last character in the string.
This tells the Arduino that the tune has finished.
For example, the following are all valid tokens:
c2 // play a 'C' note for a duration of 2 (equivalent to a quaver or 1/8 note)
a#4 // play an 'A#' note for a duration of 4 (equivalent to a crotchet or 1/4 note)
A#4 // play an 'A#' note an octave higher for a duration of 4 (equivalent to a crotchet or 1/4 note)
,8 // a minim (or 1/2 note) rest
The following are NOT valid tokens:
cBd // each of the 3 notes must be followed by a number representing its duration
,#6 // a rest cannot be "sharpened"
The following is a valid string representing a melody:
"e4d4c4d4e4e4e4,4d4d4d4,4e4g4g4,4."
The following is NOT a valid string representing a melody:
"e4d4c4d4e4e4e4,d4d4d4,4e4g4g4,4"
^ ^
because one of the rests is missing a duration value, and there is no full stop/period ('.') at the end of the string.
For more examples, look at the 4 melodies that are already written inside playTune() !

About

Play tunes through the piezo speaker on an Arduino

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tomds/Arduino-Tunes: Play tunes through the piezo speaker on an Arduino · GitHub
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Christmas tunes player (will play other tunes too!)
by Tom de Simone 8th Dec 2009
Get the circuit design and see it in action at http://meatfinish.wordpress.com/2010/12/12/arduino-christmas-tunes-player/
Inspired by the piezo circuit in the awesome oomlout beginner's guide for their Arduino Experimentation Kit (oomlout.com)
This code is licensed as Creative Commons share-alike (http://creativecommons.org/licenses/by-nc-sa/3.0/)
******** TODO: ********
- Make toggle button work better
- Redo note frequencies
Instructions
============
User selects 1 of 4 tunes to play by twisting a potentiometer and seeing a corresponding LED light up.
They then press the microswitch to play the selected tune.
If you just want to edit the melodies that are played, the only changes you need to make are in playTune(). This function works by calling parseTune()
with the following parameters:
char notes[]: a string that represents the notes of the song
int beatLength: how long a beat should be, which has a direct effect on tempo. Smaller value -> quicker; bigger -> slower
boolean loopSong: if true, the song will loop indefinitely (until you press the microswitch)
So in order to modify an existing tune, you basically have to modify the above 3 parameters in the call to parseTune();
Each tune is stored as a string of note names and their corresponding durations. Each token in the string can be represented
by the following regex:
([cdefgabCDEFGAB]#{0,1}[0-9]{1,2})|(,[0-9]{1,2})|\.
In other words, you can have a letter which represents the pitch (2 octaves possible: 'c' up to 'b', then 'C' up to 'B'),
followed by a '#' if it is a sharp (there are no flats in this grammar), and then a number representing its duration,
where 4 is a single beat (crotchet or 1/4 note), 2 is half a beat (quaver or 1/8 note), 8 is two beats (minim or 1/2 note) etc.
The duration can be any number from 1-99, but you'll rarely need longer than 16. If 1 (semiquaver or 1/16 note) really isn't
short enough for you, you could always increase the tempo ;)
To add a rest, use a comma (',') and then a number for the rest duration as above.
Finally, VERY IMPORTANT: EVERY tune you write should have a full stop/period ('.') as the last character in the string.
This tells the Arduino that the tune has finished.
For example, the following are all valid tokens:
c2 // play a 'C' note for a duration of 2 (equivalent to a quaver or 1/8 note)
a#4 // play an 'A#' note for a duration of 4 (equivalent to a crotchet or 1/4 note)
A#4 // play an 'A#' note an octave higher for a duration of 4 (equivalent to a crotchet or 1/4 note)
,8 // a minim (or 1/2 note) rest
The following are NOT valid tokens:
cBd // each of the 3 notes must be followed by a number representing its duration
,#6 // a rest cannot be "sharpened"
The following is a valid string representing a melody:
"e4d4c4d4e4e4e4,4d4d4d4,4e4g4g4,4."
The following is NOT a valid string representing a melody:
"e4d4c4d4e4e4e4,d4d4d4,4e4g4g4,4"
^ ^
because one of the rests is missing a duration value, and there is no full stop/period ('.') at the end of the string.
For more examples, look at the 4 melodies that are already written inside playTune() !

About

Play tunes through the piezo speaker on an Arduino

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tomds/Arduino-Tunes: Play tunes through the piezo speaker on an Arduino · GitHub
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Christmas tunes player (will play other tunes too!)
by Tom de Simone 8th Dec 2009
Get the circuit design and see it in action at http://meatfinish.wordpress.com/2010/12/12/arduino-christmas-tunes-player/
Inspired by the piezo circuit in the awesome oomlout beginner's guide for their Arduino Experimentation Kit (oomlout.com)
This code is licensed as Creative Commons share-alike (http://creativecommons.org/licenses/by-nc-sa/3.0/)
******** TODO: ********
- Make toggle button work better
- Redo note frequencies
Instructions
============
User selects 1 of 4 tunes to play by twisting a potentiometer and seeing a corresponding LED light up.
They then press the microswitch to play the selected tune.
If you just want to edit the melodies that are played, the only changes you need to make are in playTune(). This function works by calling parseTune()
with the following parameters:
char notes[]: a string that represents the notes of the song
int beatLength: how long a beat should be, which has a direct effect on tempo. Smaller value -> quicker; bigger -> slower
boolean loopSong: if true, the song will loop indefinitely (until you press the microswitch)
So in order to modify an existing tune, you basically have to modify the above 3 parameters in the call to parseTune();
Each tune is stored as a string of note names and their corresponding durations. Each token in the string can be represented
by the following regex:
([cdefgabCDEFGAB]#{0,1}[0-9]{1,2})|(,[0-9]{1,2})|\.
In other words, you can have a letter which represents the pitch (2 octaves possible: 'c' up to 'b', then 'C' up to 'B'),
followed by a '#' if it is a sharp (there are no flats in this grammar), and then a number representing its duration,
where 4 is a single beat (crotchet or 1/4 note), 2 is half a beat (quaver or 1/8 note), 8 is two beats (minim or 1/2 note) etc.
The duration can be any number from 1-99, but you'll rarely need longer than 16. If 1 (semiquaver or 1/16 note) really isn't
short enough for you, you could always increase the tempo ;)
To add a rest, use a comma (',') and then a number for the rest duration as above.
Finally, VERY IMPORTANT: EVERY tune you write should have a full stop/period ('.') as the last character in the string.
This tells the Arduino that the tune has finished.
For example, the following are all valid tokens:
c2 // play a 'C' note for a duration of 2 (equivalent to a quaver or 1/8 note)
a#4 // play an 'A#' note for a duration of 4 (equivalent to a crotchet or 1/4 note)
A#4 // play an 'A#' note an octave higher for a duration of 4 (equivalent to a crotchet or 1/4 note)
,8 // a minim (or 1/2 note) rest
The following are NOT valid tokens:
cBd // each of the 3 notes must be followed by a number representing its duration
,#6 // a rest cannot be "sharpened"
The following is a valid string representing a melody:
"e4d4c4d4e4e4e4,4d4d4d4,4e4g4g4,4."
The following is NOT a valid string representing a melody:
"e4d4c4d4e4e4e4,d4d4d4,4e4g4g4,4"
^ ^
because one of the rests is missing a duration value, and there is no full stop/period ('.') at the end of the string.
For more examples, look at the 4 melodies that are already written inside playTune() !

About

Play tunes through the piezo speaker on an Arduino

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - tomds/Arduino-Tunes: Play tunes through the piezo speaker on an Arduino · GitHub
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Christmas tunes player (will play other tunes too!)
by Tom de Simone 8th Dec 2009
Get the circuit design and see it in action at http://meatfinish.wordpress.com/2010/12/12/arduino-christmas-tunes-player/
Inspired by the piezo circuit in the awesome oomlout beginner's guide for their Arduino Experimentation Kit (oomlout.com)
This code is licensed as Creative Commons share-alike (http://creativecommons.org/licenses/by-nc-sa/3.0/)
******** TODO: ********
- Make toggle button work better
- Redo note frequencies
Instructions
============
User selects 1 of 4 tunes to play by twisting a potentiometer and seeing a corresponding LED light up.
They then press the microswitch to play the selected tune.
If you just want to edit the melodies that are played, the only changes you need to make are in playTune(). This function works by calling parseTune()
with the following parameters:
char notes[]: a string that represents the notes of the song
int beatLength: how long a beat should be, which has a direct effect on tempo. Smaller value -> quicker; bigger -> slower
boolean loopSong: if true, the song will loop indefinitely (until you press the microswitch)
So in order to modify an existing tune, you basically have to modify the above 3 parameters in the call to parseTune();
Each tune is stored as a string of note names and their corresponding durations. Each token in the string can be represented
by the following regex:
([cdefgabCDEFGAB]#{0,1}[0-9]{1,2})|(,[0-9]{1,2})|\.
In other words, you can have a letter which represents the pitch (2 octaves possible: 'c' up to 'b', then 'C' up to 'B'),
followed by a '#' if it is a sharp (there are no flats in this grammar), and then a number representing its duration,
where 4 is a single beat (crotchet or 1/4 note), 2 is half a beat (quaver or 1/8 note), 8 is two beats (minim or 1/2 note) etc.
The duration can be any number from 1-99, but you'll rarely need longer than 16. If 1 (semiquaver or 1/16 note) really isn't
short enough for you, you could always increase the tempo ;)
To add a rest, use a comma (',') and then a number for the rest duration as above.
Finally, VERY IMPORTANT: EVERY tune you write should have a full stop/period ('.') as the last character in the string.
This tells the Arduino that the tune has finished.
For example, the following are all valid tokens:
c2 // play a 'C' note for a duration of 2 (equivalent to a quaver or 1/8 note)
a#4 // play an 'A#' note for a duration of 4 (equivalent to a crotchet or 1/4 note)
A#4 // play an 'A#' note an octave higher for a duration of 4 (equivalent to a crotchet or 1/4 note)
,8 // a minim (or 1/2 note) rest
The following are NOT valid tokens:
cBd // each of the 3 notes must be followed by a number representing its duration
,#6 // a rest cannot be "sharpened"
The following is a valid string representing a melody:
"e4d4c4d4e4e4e4,4d4d4d4,4e4g4g4,4."
The following is NOT a valid string representing a melody:
"e4d4c4d4e4e4e4,d4d4d4,4e4g4g4,4"
^ ^
because one of the rests is missing a duration value, and there is no full stop/period ('.') at the end of the string.
For more examples, look at the 4 melodies that are already written inside playTune() !

About

Play tunes through the piezo speaker on an Arduino

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages