May 22, 2013

World's silliest arduino-based electronic musical instrument

This is the world's silliest arduino-based electronic musical instrument. It is a mashup of the "Melody" tutorial and the "Button" tutorial.  The code I modified (see below) strips out the part where the tune is actually played and instead plays a single note when each button is pressed.

/* Melody
 * (cleft) 2005 D. Cuartielles for K3
 * This example uses a piezo speaker to play melodies.  It sends
 * a square wave of the appropriate frequency to the piezo, generating
 * the corresponding tone.
 * The calculation of the tones is made following the mathematical
 * operation:
 *       timeHigh = period / 2 = 1 / (2 * toneFrequency)
 * where the different tones are described as in the table:
 * note  frequency  period  timeHigh
 * c          261 Hz          3830  1915  
 * d          294 Hz          3400  1700  
 * e          329 Hz          3038  1519  
 * f          349 Hz          2864  1432  
 * g          392 Hz          2550  1275  
 * a          440 Hz          2272  1136  
 * b          493 Hz          2028 1014 
 * C         523 Hz         1912  956
int speakerPin = 9;
int button1 = 3;
int button2 = 4;
int button3 = 5;

int val1 = 0;
int val2 = 0;
int val3 = 0;

int length = 15; // the number of notes
char notes[] = "ccggaagffeeddc "; // a space represents a rest
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
int tempo = 300;

void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    digitalWrite(speakerPin, LOW);

void playNote(char note, int duration) {
  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
  // play the tone corresponding to the note name
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);

void setup() {
  pinMode(speakerPin, OUTPUT);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);

void loop() {
  val1 = digitalRead(button1);
  val2 = digitalRead(button2);
  val3 = digitalRead(button3);
    if (val1 == LOW) {
      playNote('c', 1 * tempo);
//    } else {
//      playNote(notes[i], beats[i] * tempo);
if (val2 == LOW) {
      playNote('e', 1 * tempo);
    if (val3 == LOW) {
      playNote('g', 1 * tempo);  


Hoop jumping

INCIDENTAL COMICS: Message to a Graduate
Image credit: Grant Snider, Incidental Comics

By the end of high school, all I could see was the hoop jumping. I was so sick of it: every class was predetermined for me with only my extracurriculars to numb the boredom of the required classes. I looked forward to college knowing that while I would have to take general education classes, at least I would have options to choose from.

By the end of college, I saw that while the hoops were fewer and further between, I still detested them. I put off some general education classes until the last year I was in school.  I looked forward to going to grad school where there would be no hoops to jump through.

By the end of grad school, I realized that I was wrong about the hoops.  They were still there, they were just disguised. I grudgingly jumped through them and looked forward to getting out of grad school so I could be free of the hoops.

By now I've come to understand that the hoops never truly go away.  But what this comic says to me is that I can choose my own goals which are interesting to me.  That makes all the difference in the world.

(Thanks to @rjallain for pointing the comic out to me on twitter.)

May 08, 2013

New rules for screencast assignments

I tend to really hate rules in the classes I teach. I like the formats to be free flowing so that students are empowered to learn in their own way and in their own style.

I like screencasts as assessments, especially when I'm able to get them watched and responded to rapidly as intended. But anyone who makes blanket statements about students today being "digital natives" who grew up online creating and sharing content have not been in the same classrooms I've been in.

For next year I have some new rules for submitting screencasts:

1.) I will only accept URLs as screencast submissions.  I don't want a file as an attachment to an email in whatever crazy format came out of the camera. I don't want an audio file with a snapshot of the work done. I don't want a thumbdrive with each screencast file sized over 300 MB. I want a link to your screencast which is on youtube,, vimeo or similar.

2.) All students will be shown this Public Service Announcement on the first day. If I can't see the work done on the page while I'm in full screen mode, then what is the point of getting the visuals? Not that it is much better sometimes when the camera is held close to the page. My head hurts after watching videos where less than half a page of work is shown in video and so the camera is constantly panning back and forth.  The same goes for videos sent to me in landscape orientation but with the page rotated...or upside down.  Students will be told to watch their videos before sending me the link.

3.) All phones must have notifications turned off while recording screencasts.  I'm listening to screencasts when the volume explodes with some random buzzing and I jump out of my skin. It is five freaking minutes that the text messages, facebook updates, tweets, emails, phone calls and instagrams can just be shut down.

Most of the complaints I have are about screencasts done using cell phone cameras.  I don't mind the use of the cell phone camera, it just seems more prone to the problem videos that I get.