Hey Guys,
I have made a basic laser harp (9 string, red lasers firing into LDR's) using the teensy and the audio library. I have it wokring and its seems quite nice only the strings from the audio library don't sound very harp like. I was wondering is perhaps I could get some help understanding if/how/where I can modify the "string" objects to play with the karplus strong stuff to maybe tune the sound.
Thoughts?
Jon
I have made a basic laser harp (9 string, red lasers firing into LDR's) using the teensy and the audio library. I have it wokring and its seems quite nice only the strings from the audio library don't sound very harp like. I was wondering is perhaps I could get some help understanding if/how/where I can modify the "string" objects to play with the karplus strong stuff to maybe tune the sound.
Thoughts?
Jon
Code:
#include <Audio.h>
#include <Wire.h>
#include <SD.h>
#include <SPI.h>
#include <SerialFlash.h>
//#include "chords.h"
// Video of TouchGuitar in action :)
// https://youtu.be/TidIpeY_6T8?t=12s
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
// GUItool: begin automatically generated code
AudioSynthKarplusStrong string2; //xy=55,566.3945713043213
AudioSynthKarplusStrong string3; //xy=55,607.3515167236328
AudioSynthKarplusStrong string4; //xy=55,651.100923538208
AudioSynthKarplusStrong string5; //xy=55,704.1586656570435
AudioSynthKarplusStrong string6; //xy=55,754.4239673614502
AudioSynthKarplusStrong string8; //xy=55,852.9138088226318
AudioSynthKarplusStrong string7; //xy=55.85032653808594,808.8988351821899
AudioSynthKarplusStrong string1; //xy=57.792518615722656,513.3368072509766
AudioSynthKarplusStrong string9; //xy=59.77735137939453,904.378137588501
AudioMixer4 mixer1; //xy=329.597412109375,608.2823524475098
AudioMixer4 mixer2; //xy=464.36792755126953,673.2475929260254
AudioMixer4 mixer3; //xy=599.1919746398926,736.569242477417
AudioOutputAnalog dac1; //xy=769.7055206298828,793.525731086731
AudioConnection patchCord1(string2, 0, mixer1, 1);
AudioConnection patchCord2(string3, 0, mixer1, 2);
AudioConnection patchCord3(string4, 0, mixer1, 3);
AudioConnection patchCord4(string5, 0, mixer2, 1);
AudioConnection patchCord5(string6, 0, mixer2, 2);
AudioConnection patchCord6(string8, 0, mixer3, 1);
AudioConnection patchCord7(string7, 0, mixer2, 3);
AudioConnection patchCord8(string1, 0, mixer1, 0);
AudioConnection patchCord9(string9, 0, mixer3, 2);
AudioConnection patchCord10(mixer1, 0, mixer2, 0);
AudioConnection patchCord11(mixer2, 0, mixer3, 0);
AudioConnection patchCord12(mixer3, dac1);
// GUItool: end automatically generated code
const int ledPin = 13; //for testing
void setup() {
AudioMemory(15);
pinMode(ledPin, OUTPUT);
//Serial.begin(38400);
dac1.analogReference(INTERNAL); // normal volume
//dac1.analogReference(EXTERNAL); // louder
mixer1.gain(0, 0.27);
mixer1.gain(1, 0.27);
mixer1.gain(2, 0.27);
mixer1.gain(3, 0.27);
//mixer2.gain(0, 0.27);input from mix 1 no gain
mixer2.gain(1, 0.27);
mixer2.gain(2, 0.27);
mixer2.gain(3, 0.27);
//mixer3.gain(0, 0.27);input from mix 2 no gain
mixer3.gain(1, 0.27);
mixer3.gain(2, 0.27);
mixer3.gain(3, 0.27);
delay(100);
}
int val[9]; //analog readings from LDRs
int ambient[9]; //ambient light levels
bool stringOn[9]; //is the laser "string" currently blocked
bool runOnce = false; //flag for reading ambient light
void loop()
{
if(!runOnce){
//Serial.println("RunOnce");
readStrings();
for(int i=0;i<9;i++){
ambient[i] = val[i] + 75;
//Serial.println(ambient[i]);
}
runOnce = true;
}
readStrings();
playNotes();
}
void readStrings()
{
val[0] = analogRead(0);
val[1] = analogRead(1);
val[2] = analogRead(2);
val[3] = analogRead(3);
val[4] = analogRead(4);
val[5] = analogRead(5);
val[6] = analogRead(6);
val[7] = analogRead(7);
val[8] = analogRead(8);
/*//for debugging
Serial.print("Analog 0 is: ");
Serial.println(val[0]);
Serial.print("Analog 1 is: ");
Serial.println(val[1]);
Serial.print("Analog 2 is: ");
Serial.println(val[2]);
Serial.print("Analog 3 is: ");
Serial.println(val[3]);
Serial.print("Analog 4 is: ");
Serial.println(val[4]);
Serial.print("Analog 5 is: ");
Serial.println(val[5]);
Serial.print("Analog 6 is: ");
Serial.println(val[6]);
Serial.print("Analog 7 is: ");
Serial.println(val[7]);
Serial.print("Analog 8 is: ");
Serial.println(val[8]);//*/
}
void playNotes(){
if(val[0] > ambient[0]){
if(stringOn[0]==false){
string1.noteOn(220.00, 1.0); //A
stringOn[0] = true;
}
}else {
//string1.noteOff(0);
stringOn[0] = false;
}
if(val[1] > ambient[1]){
if(stringOn[1]==false){
string2.noteOn(233.082, 1.0);//Bb
stringOn[1] = true;
}
}else {
//string2.noteOff(0);
stringOn[1] = false;
}
if(val[2] > ambient[2]){
if(stringOn[2]==false){
string3.noteOn(261.626, 1.0);//C
stringOn[2] = true;
}
}else {
//string3.noteOff(0);
stringOn[2] = false;
}
if(val[3] > ambient[3]){
if(stringOn[3]==false){
string4.noteOn(293.665, 1.0);//D
stringOn[3] = true;
}
}else {
//string4.noteOff(0);
stringOn[3] = false;
}
if(val[4] > ambient[4]){
if(stringOn[4]==false){
string5.noteOn(329.628, 1.0);//E
stringOn[4] = true;
}
}else {
stringOn[4] = false;
//string5.noteOff(0);
}
if(val[5] > ambient[5]){
if(stringOn[5]==false){
string6.noteOn(349.228, 1.0);//F
stringOn[5] = true;
}
}else {
//string6.noteOff(0);
stringOn[5] = false;
}
if(val[6] > ambient[6]){
if(stringOn[6]==false){
stringOn[6] = true;
string7.noteOn(391.995, 1.0);//G
}
}else {
//string7.noteOff(0);
stringOn[6] = false;
}
if(val[7] > ambient[7]){
if(stringOn[7]==false){
string8.noteOn(440.00, 1.0);//A
stringOn[7] = true;
}
}else {
//string8.noteOff(0);
stringOn[7] = false;
}
if(val[8] > ambient[8]){
if(stringOn[8]==false){
string9.noteOn(466.164, 1.0);//Bb
stringOn[8] = true;
}
}else {
//string9.noteOff(0);
stringOn[8] = false;
}
}