user33746: I'd like to make a musical harp that utilizes break beam sensors.
I'd really appreciate guidance on these two questions:

How should I go about listening for multiple beam breaks at the same time? I'd like the box to be able to play cords, so I'd need to listen for the break beams while simultaneously taking the action do to other previous break beams. Are there any links to similar projects for guidance on handling multiple inputs (possibly multiple interrupts) at the same time, as well is multiple outputs?
Where is a good place to start to understand how to output non-buzzer sound with an Arduino? I bought a Adafruit Wave Shield to do the trick, but I'd appreciate advice on using this, or possibly taking an easier route. 

My major concern is the first question however, and it makes me think I may need a Pi possibly? But I've never worked with those, so I'd like to avoid it if possible.
Thanks!  :)

user359: Most of the examples for that shield seem to suffer from what could be called delayitis. If you first convert the piano example to a more state-based approach then the loop you want becomes much simpler:
#define NUM_BEAMS 12
// a single octave

char filename[NUM_BEAMS+5]; //init the last 5 chars to ".wav\0"
int previousInputs; //flag variable where each bit is a single beam

void loop(){
    int inputs = readBeams();

    if(inputs != previousInputs){
      previousInputs = inputs;
      if (wave.isplaying) {// already playing something, so stop it!
        wave.stop(); // stop it
      }
      if(inputs == 0){
        return;
      }
      for(int i = 0; i< NUM_BEAMS; i++){
          filename[i] = inputs &(1<<i)?'1':'0';
      }

      if (!f.open(root, filename)) {
        putstring("Couldn't open file "); Serial.print(name); return;
      }
      if (!wave.create(f)) {
        putstring_nl("Not a valid WAV"); return;
      }
      // ok time to play!
      wave.play();
    }

}

The SD card in the shield will need 4095 files, each containing the chord that must be played.
No need for interrupts, no messy interrupt based IO. Just a simple loop() where you read the input and if different from last time start playing a new file.
If you have a shield that can actually do sound mixing then, instead of needing a file for every possible chord, you can start playing the note when the corresponding bit in started = inputs & ~previousInputs; is 1 and stop playing the note when the corresponding bit in ended = ~inputs & previousInputs; is 1.

user37418: I quite like rachet freaks's idea, however whilst making an example for you his answer hadn't been posted. SO i'll chip in anyway!
In general it is possible to control and measure more than one input and output at the same time by the use of millis(). millis() is an arduino function that returns the number of milliseconds since the arduino fired up.
This probably doesnt sound overly useful to you straight away. But millis can be used in place of delay() if used correctly. Essentially you create a long variable to hold the beginning of an event and check the time since that event started with an if statement. If the difference in the current time and the start time is equal to the time you want the event to occur. Stop the event.
I appreciate my explanation might not be overly clear. So I wrote an example sketch. The sketch has two button inputs. And two button outputs. If one of the buttons is pressed one led will blink for 10 seconds, pressing the button mid blink will extend the time the led blinks by another 10 seconds. Whilst this is happening if you press the second button the other led will turn on, but only when the button is pressed. Using delay() to achieve this would not work nearly as well.
//Setup led and button pins
int ledPin1 = 3;
int ledPin2 = 4;
int butPin1 = 5;
int butPin2 = 6;

//Setup timers
unsigned long currentMillis = 0;
unsigned long blinkStartMillis = 0;
unsigned long ledOnMillis1 = 0;
unsigned long ledOffMillis1 =0;

//Setup variables to store input and output states.
int ledState1 = 0, ledState2 = 0; //State 1 for on, 0 for off;
int butState1 = 0, butState2 = 0; //State 1 for trigger, 0 for off;

//Setup trigger for event
int blinkTrigger = 0;

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(butPin1, INPUT);
  pinMode(butPin2, INPUT);

  delay(500);
}

void loop() {
    //Sets current millis for this loop
    currentMillis = millis();

    //Reads Button States
    butState1 = digitalRead(butPin1);
    butState2 = digitalRead(butPin2);

    //Setup to start blink if button 1 input is high
    if(butState1) {
      blinkTrigger = 1;
      blinkStartMillis = currentMillis;
    }

    //Handles Blinking
    if(blinkTrigger) {

      //If led1 off, and has been off for 500 milliseconds. led 1 on
      if(ledState1 == 0 && currentMillis - LedOffMillis >= 500) {
        digitalWrite(ledPin1, HIGH);
        ledState1 = 1;
        ledOnMillis = currentMillis;
      }

      //If led1 on, and has been on for 500 milliseconds. led 1 off
      if(ledState1 == 1 && currentMillis - LedOnMillis >= 500) {
        digitalWrite(ledPin1, LOW);
        ledState1 = 0;
        ledOffMillis = currentMillis;
      }

      //If led1 has been blinking for more than 10 seconds
      //Stop blinking
      if(currentMillis - blinkStartMillis > 10000) {
        digitalWrite(ledPin1, LOW);
        ledState1 = 0;
        blinkTrigger = 0;
      }
    }

    //While Button 2 pressed led 2 on
    if(butState2) digitalWrite(ledPin2, HIGH);
    if(!butState2) digitalWrite(ledPin2, LOW);

}

Note: The code style is a bit off because i rushed it, I would also usually use structs to hold the timers and event triggers.
Now for the Wave module rachet is bang on the money, you would need a file for every single note and every single chord.
I hope I helped, if not for your project maybe you may have learnt how to handle more than one event using event timings.

33746: <p>I'd like to make a musical harp that utilizes break beam sensors.</p>

<p>I'd really appreciate guidance on these two questions:</p>

<ul>
<li><p>How should I go about listening for multiple beam breaks at the same time? I'd like the box to be able to play cords, so I'd need to listen for the break beams while simultaneously taking the action do to other previous break beams. Are there any links to similar projects for guidance on handling multiple inputs (possibly multiple interrupts) at the same time, as well is multiple outputs?</p></li>
<li><p>Where is a good place to start to understand how to output non-buzzer sound with an Arduino? I bought a Adafruit Wave Shield to do the trick, but I'd appreciate advice on using this, or possibly taking an easier route. </p></li>
</ul>

<p>My major concern is the first question however, and it makes me think I may need a Pi possibly? But I've never worked with those, so I'd like to avoid it if possible.</p>

<p>Thanks!  :)</p>
 359: <p>Most of the examples for that shield seem to suffer from what could be called <code>delay</code>itis. If you first convert the piano example to a more state-based approach then the loop you want becomes much simpler:</p>

<pre><code>#define NUM_BEAMS 12
// a single octave

char filename[NUM_BEAMS+5]; //init the last 5 chars to ".wav\0"
int previousInputs; //flag variable where each bit is a single beam

void loop(){
    int inputs = readBeams();

    if(inputs != previousInputs){
      previousInputs = inputs;
      if (wave.isplaying) {// already playing something, so stop it!
        wave.stop(); // stop it
      }
      if(inputs == 0){
        return;
      }
      for(int i = 0; i&lt; NUM_BEAMS; i++){
          filename[i] = inputs &amp;(1&lt;&lt;i)?'1':'0';
      }

      if (!f.open(root, filename)) {
        putstring("Couldn't open file "); Serial.print(name); return;
      }
      if (!wave.create(f)) {
        putstring_nl("Not a valid WAV"); return;
      }
      // ok time to play!
      wave.play();
    }

}
</code></pre>

<p>The SD card in the shield will need 4095 files, each containing the chord that must be played.</p>

<p>No need for interrupts, no messy interrupt based IO. Just a simple <code>loop()</code> where you read the input and if different from last time start playing a new file.</p>

<p>If you have a shield that can actually do sound mixing then, instead of needing a file for <em>every possible chord</em>, you can start playing the note when the corresponding bit in <code>started = inputs &amp; ~previousInputs;</code> is 1 and stop playing the note when the corresponding bit in <code>ended = ~inputs &amp; previousInputs;</code> is 1.</p>
 37418: <p>I quite like rachet freaks's idea, however whilst making an example for you his answer hadn't been posted. SO i'll chip in anyway!</p>

<p>In general it is possible to control and measure more than one input and output at the same time by the use of millis(). millis() is an arduino function that returns the number of milliseconds since the arduino fired up.</p>

<p>This probably doesnt sound overly useful to you straight away. But millis can be used in place of delay() if used correctly. Essentially you create a long variable to hold the beginning of an event and check the time since that event started with an if statement. If the difference in the current time and the start time is equal to the time you want the event to occur. Stop the event.</p>

<p>I appreciate my explanation might not be overly clear. So I wrote an example sketch. The sketch has two button inputs. And two button outputs. If one of the buttons is pressed one led will blink for 10 seconds, pressing the button mid blink will extend the time the led blinks by another 10 seconds. Whilst this is happening if you press the second button the other led will turn on, but only when the button is pressed. Using delay() to achieve this would not work nearly as well.</p>

<pre><code>//Setup led and button pins
int ledPin1 = 3;
int ledPin2 = 4;
int butPin1 = 5;
int butPin2 = 6;

//Setup timers
unsigned long currentMillis = 0;
unsigned long blinkStartMillis = 0;
unsigned long ledOnMillis1 = 0;
unsigned long ledOffMillis1 =0;

//Setup variables to store input and output states.
int ledState1 = 0, ledState2 = 0; //State 1 for on, 0 for off;
int butState1 = 0, butState2 = 0; //State 1 for trigger, 0 for off;

//Setup trigger for event
int blinkTrigger = 0;

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(butPin1, INPUT);
  pinMode(butPin2, INPUT);

  delay(500);
}

void loop() {
    //Sets current millis for this loop
    currentMillis = millis();

    //Reads Button States
    butState1 = digitalRead(butPin1);
    butState2 = digitalRead(butPin2);

    //Setup to start blink if button 1 input is high
    if(butState1) {
      blinkTrigger = 1;
      blinkStartMillis = currentMillis;
    }

    //Handles Blinking
    if(blinkTrigger) {

      //If led1 off, and has been off for 500 milliseconds. led 1 on
      if(ledState1 == 0 &amp;&amp; currentMillis - LedOffMillis &gt;= 500) {
        digitalWrite(ledPin1, HIGH);
        ledState1 = 1;
        ledOnMillis = currentMillis;
      }

      //If led1 on, and has been on for 500 milliseconds. led 1 off
      if(ledState1 == 1 &amp;&amp; currentMillis - LedOnMillis &gt;= 500) {
        digitalWrite(ledPin1, LOW);
        ledState1 = 0;
        ledOffMillis = currentMillis;
      }

      //If led1 has been blinking for more than 10 seconds
      //Stop blinking
      if(currentMillis - blinkStartMillis &gt; 10000) {
        digitalWrite(ledPin1, LOW);
        ledState1 = 0;
        blinkTrigger = 0;
      }
    }

    //While Button 2 pressed led 2 on
    if(butState2) digitalWrite(ledPin2, HIGH);
    if(!butState2) digitalWrite(ledPin2, LOW);

}
</code></pre>

<p>Note: The code style is a bit off because i rushed it, I would also usually use structs to hold the timers and event triggers.</p>

<p>Now for the Wave module rachet is bang on the money, you would need a file for every single note and every single chord.</p>

<p>I hope I helped, if not for your project maybe you may have learnt how to handle more than one event using event timings.</p>
