レーザーハープのコードBeta2

#include <LiquidCrystal.h>

#define NOTE_ON 144       
#define CONTROLCHANGE 176 
#define ALLSOUNDOFF 120 
#define SensorsNumber 6 //number of photo sensor
#define Legato 10
#define Limit 710

LiquidCrystal lcd(0, 1, 2, 3, 4, 5);

const int RightSW=13, LeftSW=10, ToggleDown=12, ToggleUp=11;
int nLB=0,nLM=1,nLT=2,nRB=3,nRM=4,nRT=5,vLB=1,vLM=1,vLT=1,vRB=1,vRM=1,vRT=1; //n=note,v=velocity
int Input[SensorsNumber] = {0,1,2,4,5,3};
int Note[SensorsNumber] = {nRT,nRM,nRB,nLT,nLM,nLB};
int Velocity[SensorsNumber] = {vRT,vRM,vRB,vLT,vLM,vLB};
short Counter[Sensorsnumber]; //change to int

void sendMidi(int cmd, int pitch, int velocity);
void Evaluate(int Value, int Note, int State, int Velocity);

//LB=LeftBottom(pin3),LM=LeftMiddle(pin5),LT=LeftTop(pin4),RB=RightBottom(pin2),RM=RightMiddle(pin1),RT=RightTop(pin0)

void sendMidi(int cmd, int pitch, int velocity) {
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}

int Evaluate(int Pin){
   int Status = 0;
//thanks to developer who establish this function:https://jumbleat.com/2016/12/01/revision_of_avoiding_chatter/  
   if(1000 < analogRead(Input[Pin])){
     Counter[Pin]++;  //increase number
     if(Counter[Pin] > Limit){ //when count get limitance
       Counter[Pin] = Limit;
     }
   }else{
     if(Counter[Pin] > Legato){
       Status = 3; //stop shading 
     }
     Counter[Pin] = 0;
   }

   if(Counter[Pin] > Legato){
     Status = 2; //while shading
   }
   else if(Counter[Pin] == Legato){
     Status = 1; //start shading
   }

   return Status;
}

void setup() {  //setting up pinmode, LCD and MIDI
  Serial.begin(31250);
  pinMode(RightSW,INPUT);  //now developing laser harp systems with switches
  pinMode(LeftSW,INPUT);
  pinMode(ToggleDown,INPUT);
  pinMode(ToggleUp,INPUT);
  lcd.begin(16, 2);
  sendMidi(CONTROLCHANGE, ALLSOUNDOFF, 0); 
}

void loop(){
  for(int n = 0; n < SensorsNumber; n++){
    int Status = Evaluate(n);
    if(Status == 1){
      sendMidi(NOTE_ON, Note[n], Velocity[n]);
    }
    else if(Status == 3){
      sendMidi(NOTE_ON, Note[n], 0);  //velocity 0 means note off
    }
  }
}

レーザーハープのコードBeta

#include <LiquidCrystal.h>

#define NOTE_ON 144
#define CONTROLCHANGE 176
#define ALLSOUNDOFF 120
#define SensorsNumber 6 //number of photo sensor
#define Legato 10
#define Limit 710

LiquidCrystal lcd(0, 1, 2, 3, 4, 5);

const int RightSW=13, LeftSW=10, ToggleDown=12, ToggleUp=11;
int nLB=0,nLM=1,nLT=2,nRB=3,nRM=4,nRT=5,vLB=1,vLM=1,vLT=1,vRB=1,vRM=1,vRT=1; //n=note,v=velocity
int Input[SensorsNumber] = {0,1,2,4,5,3};
int Note[SensorsNumber] = {nRT,nRM,nRB,nLT,nLM,nLB};
int Velocity[SensorsNumber] = {vRT,vRM,vRB,vLT,vLM,vLB};
short Counter[Sensorsnumber]; //change to int

void sendMidi(int cmd, int pitch, int velocity);
void Evaluate(int Value, int Note, int State, int Velocity);

//LB=LeftBottom(pin3),LM=LeftMiddle(pin5),LT=LeftTop(pin4),RB=RightBottom(pin2),RM=RightMiddle(pin1),RT=RightTop(pin0)

void sendMidi(int cmd, int pitch, int velocity) {
Serial.write(cmd);
Serial.write(pitch);
Serial.write(velocity);
}

int Evaluate(int Pin){
int Status = 0;
//thanks to developer who establish this function:https://jumbleat.com/2016/12/01/revision_of_avoiding_chatter/
if(1000 < analogRead(Input[Pin])){
Counter[Pin]++; //increase number
if(Counter[Pin] > Limit){ //when count get limitance
Counter[Pin] = Limit;
}
}else{
if(Counter[Pin] > Legato){
Status = 3; //stop shading
}
Counter[Pin] = 0;
}

if(Counter[Pin] > Legato){
Status = 2; //while shading
}
else if(Counter[Pin] == Legato){
Status = 1; //start shading
}

return Status;
}

void setup() { //setting up pinmode, LCD and MIDI
Serial.begin(31250);
pinMode(RightSW,INPUT); //now developing laser harp systems with switches
pinMode(LeftSW,INPUT);
pinMode(ToggleDown,INPUT);
pinMode(ToggleUp,INPUT);
lcd.begin(16, 2);
sendMidi(CONTROLCHANGE, ALLSOUNDOFF, 0);
}

void loop(){
for(int n = 0; n < SensorsNumber; n++){
int Status = Evaluate(n);
if(Status == 1){
sendMidi(NOTE_ON, Note[n], Velocity[n]);
}
else if(Status == 3){
sendMidi(NOTE_ON, Note[n], 0); //velocity 0 means note off
}
}
}

各種ギターシンセの今後の展望

 そもそもギターシンセとは何かを振り返る。ギターシンセとは、ギターに搭載されたピックアップ(以下PU)からの電気信号を元に波形を変化させることで音色に特色を加えるエフェクターとは異なる。ギターシンセは基本的には次のうちどちらかを用いて、波形を変化させて得られる音とは程遠い音を発生させるものである。

続きを読む

レーザーハープ製作の記録 #0 レーザーハープの仕組み

製作過程はこちら↓

#1

#2 

#3  

 今回はレーザーハープを作る前に筆者が考えるレーザーハープの仕組みを紹介します。そしてこのレーザーハープ製作日記はこの考えのもと制作が進むものとします。

 レーザーハープで弦を弾いた結果、音が出るまでの過程に使われるハードウェアの関係を端的に図で説明すると下図の通りです。

f:id:Tybe_Taylor:20210504230628j:plain

ここで主にポイントとなる点が、

  1. レーザーハープ内センサー
  2. コンソール内でのMIDI信号への変換
  3. パソコン上でMIDI信号を音に変換する

の3点です。これからはこの3点について詳しく説明します。

続きを読む

BootCampでパーティーションを作成できない不具合

この記事では筆者のMacでBootCampアシスタントを用いてセットアップを行う際に

「ディスクにパーティションを作成できませんでした。ディスクのパーティション作成中にエラーが起きました。ディスクユーティリティ内の First Aid を実行してエラーを確認し、修正してください」

とエラーが出てしまう問題について解決するのに手間取った過程を紹介します。

同じエラーで困っていらっしゃる方に役に立てばと思い筆者が行った対処を紹介します。

f:id:Tybe_Taylor:20210324230514p:plain

続きを読む

レーザーハープ製作日記[不定期] #3 回路設計

前回はこちら(#2 製作準備)

レーザーハープ製作日記[不定期] #2 製作準備 - 128bitの誘惑

 

#2から時間が経ちまして、やっとこさ基盤へのはんだ付けが完了しました。

部品の配置は以下の通りです。

f:id:Tybe_Taylor:20200618010457j:image

続きを読む

レーザーハープ製作日記[不定期] #2 製作準備

前回はこちら(#1 はじまり)

https://128bit-allurements.hatenablog.com/entry/laser-harp-diary1

 

前回はレーザーハープの概説と計画を紹介しました。その中で次回は回路図を、と言いましたが、今回はある程度部品の使用目処が立ちましたので使用する部品を紹介します。

 

続きを読む