MIDI Davul Eldiveni

Parmaklarınız ile davul çalabilmek mümkün. Sinyaller yardımı ile yazılımı notalara dönüştürebiliriz. Arduino Micro ile melodi oluşturuyoruz. Projemizde kullanacağımız malzemeler aşağıda verilmiştir:

  • Arduino Micro

  • 4 Adet 220R Direnç

  • 4 Adet Piezo

  • Jumper Kablolar

  • Breadboard

Öncelikle devremizi kuruyoruz. Devre şeması aşağıda verilmiştir.

Kod yazmaya geçmeden önce indirmemiz gereken 2 adet program var. MIDI'yi ayarlamak için kullanılacaktır. İlk program Virtual-Key olacaktır. Uygulamayı indirdikten sonra Transpose üzerinden ayarlamalar yaparak çalışma frekansını ayarlıyoruz. Piyano üzerindeki tuşlardan biri yanması karar vermemiz için yeterlidir.

Ableton Live 11 indirmemiz gereken diğer bir uygulamadır. Sinyallerin notaya dönüştürülmüş halini bu uygulama üzerinde duyacağız. Piezo'lar ile oynadıkça ayarladığımız ses türünden duyacağız.

Ayarlamalarımızı yaptıktan sonra artık kod kısmına geçebiliriz. Arduino IDE üzerinden kodlama yapacağız. Kullanmamız gereken MIDIUSB.h kütüphanesinin .zip dosyasını internet üzerinden indiriyoruz. Aşağıdaki adımları izleyerek indirdiğimiz .zip uzantılı dosyayı ekliyoruz.

Sesin açık ve kapalı olduğu durumlar için ayrı ayrı fonksiyon tanımı yapıyoruz. 0x09 karakteri sesin açık olduğunu, 0x08 karakteri sesin kapalı olduğunu ifade eder.

void sesAcik(byte channel, byte alan, byte yukseklik){
  midiEventPacket_t sesAcik = {0x09, 0x90 | channel, alan, yukseklik}; 
  MidiUSB.sendMIDI(sesAcik);
}

void sesKapali (byte channel, byte alan, byte yukseklik){
  midiEventPacket_t sesKapali = {0x08, 0x80 | channel, alan, yukseklik};
  MidiUSB.sendMIDI(sesKapali);
}

Piezoların bağlı olduğu pinleri tanımlıyoruz. Daha sonra bu pinlerden dizi oluşturup kodun devamında dizi üzerinden işlemlerimizi gerçekleştiriyoruz.

const int isaretParmagi = A0;
const int ortaParmak = A1;
const int yuzukParmagi = A2;
const int serceParmak = A3;

const int pin[] = {isaretParmagi, ortaParmak, yuzukParmagi, serceParmak};

Hareketi hangi ölçüden sonra tanıması gerektiğini belirlemek için eşik değer tanımlıyoruz.

const int threshold = 40;

ASCII Tablosuna göre 127 karakter olduğu için 0-127 arasındaki ses değişimlerini kontrol etmeliyiz.

void loop() {
  for (int i = 0; i<4; i++) {
    delay(1);
    long total = analogRead(pin[i]);
    if ((total > threshold) && (! currentPressed[i])) {
      currentPressed[i] = true;
      sesAcik(0, 40+i, 127);
      Serial.println("Baski:  " + String(i));
    }
    else if ((total <= threshold) && (currentPressed[i])) {
      currentPressed[i] = false;
      sesKapali(0, 40+i, 127);
      Serial.println("Baski yoksa:  " + String(i));
  }
}

Seri ve doğru iletişim için yazmamız gereken kod satırını yazıyoruz.

MidiUSB.flush();

Kodun tamamı aşağıda verilmiştir.

#include "MIDIUSB.h"

void sesAcik(byte channel, byte alan, byte yukseklik){
  midiEventPacket_t sesAcik = {0x09, 0x90 | channel, alan, yukseklik}; 
  MidiUSB.sendMIDI(sesAcik);
}

void sesKapali (byte channel, byte alan, byte yukseklik){
  midiEventPacket_t sesKapali = {0x08, 0x80 | channel, alan, yukseklik};
  MidiUSB.sendMIDI(sesKapali);
}

int ses;
const int isaretParmagi = A0;
const int ortaParmak = A1;
const int yuzukParmagi = A2;
const int serceParmak = A3;

const int pin[] = {isaretParmagi, ortaParmak, yuzukParmagi, serceParmak};

boolean currentPressed[] = {false, false, false, false};

const int threshold = 40; 


void setup() {
  Serial.begin(115200);

  pinMode(isaretParmagi, INPUT);
  pinMode(ortaParmak, INPUT);
  pinMode(yuzukParmagi, INPUT);
  pinMode(serceParmak, INPUT);
  
}

void kontrolDegisikligi(byte channel, byte kontrol, byte deger) {
  midiEventPacket_t event = {0x0B, 0XB0 | channel, kontrol, deger };
  MidiUSB.sendMIDI(event);
}

void loop() {
  for (int i = 0; i<4; i++) {
    delay(1);
    long total = analogRead(pin[i]);
    if ((total > threshold) && (! currentPressed[i])) {
      currentPressed[i] = true;
      sesAcik(0, 40+i, 127);
      Serial.println("Baski:  " + String(i));
    }
    else if ((total <= threshold) && (currentPressed[i])) {
      currentPressed[i] = false;
      sesKapali(0, 40+i, 127);
      Serial.println("Baski yoksa:  " + String(i));
  }
}
MidiUSB.flush();
}


Son Paylaşımlar