Kodのアイコン画像
Kod 2021年01月20日作成 (2021年01月24日更新)
製作品 製作品 閲覧数 1392
Kod 2021年01月20日作成 (2021年01月24日更新) 製作品 製作品 閲覧数 1392

スイッチ3つでピアノ自作

スイッチ3つでピアノ自作

しがない19歳です。

特徴

スイッチ3つだけで全てのピアノの音を鳴らすことができる。PCのキーボードと連携していて、方向キーで鍵盤にある手の位置を動かすことができる。方向キーを左右に押せば左右に動き、上を押せばシャープを押せるようになる。

作り方

1 Arduinoでスイッチを読み取るプログラムとProcessingに読み取ったデータを送るプログラムを書く。
→1bitずつしか送れないため、スイッチから読み取ったデータ3bitを1bitにすることで遅延を減らすことに成功した。

2 Processing側で受け取るプログラムを書く。

3 Processing側で鍵盤の画像を貼り付け、手の位置も追加する。

動作の様子は以下を御覧ください。
https://twitter.com/Kod75656124/status/1341589357447155712

使用言語

Arduino
Processing

これだけは言いたい。

キーボードで鍵盤を押せば遅延も少ないし良くない?と思った人。たしかにそうですが、なんかスイッチで押したかったんです!!




Arduino
void setup() {
Serial.begin(9600);
}

void loop() {
int x = digitalRead(2);
int y = digitalRead(4);
int z = digitalRead(7);

if (x == 0) {
Serial.write('1');
}
if (y == 0) {
Serial.write('2');
}
if (z == 0) {
Serial.write('3');
}
delay(5);
}




Processing
import processing.serial.;
Serial serial;
import ddf.minim.
;
import ddf.minim.signals.*;
Minim minim;
AudioOutput out;
SineWave wave;
PImage img;

int x;
int y=0;
int z=0;
int a=0;

int num=0;
void setup() {
size(800, 800);
img = loadImage("a.png");

serial = new Serial( this, Serial.list()[0], 9600 );
minim = new Minim(this);
out = minim.getLineOut(Minim.STEREO);
wave = new SineWave(0, 1.0, out.sampleRate());
out.addSignal(wave);
}

void draw() {
background(0);
image(img, 20, 20, 770, 750);
fill(0, 0, 150);
ellipse(70+num+z, 530+y, 30, 30);
ellipse(165+num+z, 500+y, 30, 30);
ellipse(260+num+a, 530+y, 30, 30);
wave.setFreq(0);
}

void serialEvent(Serial port) {
x = port.read();
println(x);
delay(5);

if (y0) {
if (num
0) {
if (x49) {
wave.setFreq(523.25);
}
if (x
50) {
wave.setFreq(587.32);
}
if (x==51) {
wave.setFreq(659.25);
}
}

if (num==95) {
  if (x==49) {          
    wave.setFreq(587.32);
  } 
  if (x==50) {
    wave.setFreq(659.25);
  }
  if (x==51) {
    wave.setFreq(698.46);
  }
}

if (num==190) {
  if (x==49) {          
    wave.setFreq(659.25);
  } 
  if (x==50) {
    wave.setFreq(698.46);
  }
  if (x==51) {
    wave.setFreq(783.99);
  }
}


if (num==285) {
  if (x==49) {          
    wave.setFreq(698.46);
  } 
  if (x==50) {
    wave.setFreq(783.99);
  }
  if (x==51) {
    wave.setFreq(880.00);
  }
}

if (num==380) {
  if (x==49) {          
    wave.setFreq(783.99);
  } 
  if (x==50) {
    wave.setFreq(880.00);
  }
  if (x==51) {
    wave.setFreq(987.77);
  }
}

if (num==475) {
  if (x==49) {          
    wave.setFreq(880.00);
  } 
  if (x==50) {
    wave.setFreq(987.77);
  }
  if (x==51) {
    wave.setFreq(1046.50);
  }
}

} else {
if (x49) {
wave.setFreq(554.37);
}
if (x
50) {
wave.setFreq(622.25);
}
if (x==51) {
wave.setFreq(739.99);
}
}
}

void stop() {
out.close();
minim.stop();
super.stop();
}

void keyPressed() {
if (key == CODED) { // コード化されているキーが押された
if (keyCode == RIGHT) { // キーコードを判定
num+=95;
} else if (keyCode == LEFT) {
num-=95;
} else if (keyCode == UP) {
num=0;
y=-150;
z+=47;
a+=147;
} else if (keyCode == DOWN) {
num=190;
y+=150;
z-=47;
a-=147;
}
}
}

  • Kod さんが 2021/01/20 に 編集 をしました。 (メッセージ: 初版)
  • Kod さんが 2021/01/24 に 編集 をしました。
ログインしてコメントを投稿する