Membuat keyboard MIDI dari synthesizer anak-anak tua

gambar

Suatu hari, kembali ke rumah, di dekat saluran sampah di pintu masuk, saya melihat synthesizer mainan anak-anak tua. Lewat, karena β€œberdosa” untuk mengambilnya dari tempat sampah, tetapi dalam hati saya ingin menyeretnya keluar dari sana. Sudah larut malam, sekitar jam 2, saya memutuskan untuk melihat apakah dia masih berdiri di sana. Dan ya, dia masih di sana! Dalam penampilan, dia benar-benar utuh dan bersih, sehingga tidak ada mual agar tidak membawanya. Jadi ya, saya membawanya.

Saya sudah lama menginginkan piano untuk diri saya sendiri, saya bukan musisi profesional, tetapi hanya untuk bersenang-senang - mengapa tidak? Membeli sesuatu "demi memanjakan" Aku "dicekik oleh katak", dan di sini - mainan gratis. Ketika saya mengambilnya dari tempat sampah, saya bahkan tidak berpikir untuk menggunakannya sebagai mainan anak-anak, saya langsung berpikir: "Ohhhh ..., dasar yang bagus untuk mencoba membuat keyboard MIDI."
Karena saya sudah memiliki pengalaman berkomunikasi dengan keyboard profesional dan keyboard MIDI, saya segera memahami semua kerugian dari ide saya. Artinya, mainan sebenarnya akan tetap menjadi mainan. Atas dasar itu tidak mungkin untuk menyadari kekuatan penekanan tombol. Kunci plastik "ringan" itu sendiri, yang juga tidak lengkap, tidak akan memungkinkan untuk melakukan sesuatu yang layak padanya.

Pertama-tama, synthesizer mainan dibongkar "ke sekrup", semua plastik dicuci dengan baik dengan sabun. Papan dan grup kontak kunci juga dibersihkan.

Setelah pembongkaran, sebuah pemahaman datang tentang mengapa orang membuangnya. Sebuah mainan (saya tidak tahu mengapa: dari waktu ke waktu, dari kualitas komponen Tiongkok atau operasi yang berat) pertama: speaker internal berantakan, dan kedua: konektor yang rusak dari mereka tertahan di jack headphone, jadi praktis tidak ada cara untuk mengeluarkannya . Mungkin, setelah mainan berhenti bermain dengan speaker internal, mereka menggunakannya dengan headphone, dan kemudian setelah mereka merusak konektor di sana, mereka hanya membuangnya.

Di dalam, synthesizer mainan terdiri dari tiga papan yang saling terhubung oleh loop kabel. Dewan pusat, yang bertanggung jawab untuk menghasilkan suara dan hal-hal lain, segera dibebaskan dari dua papan lainnya dan disisihkan. Di dua papan lainnya ada kontak untuk tombol di panel depan mainan dan tuts piano itu sendiri. Saya menyolder konektor PBS kepada mereka, terutama karena lubang pitch di papan hanya 2,54 mm.





Setelah itu, saya menghabiskan beberapa jam membuat diagram papan-papan ini dengan kunci. Ternyata, skema tersebut adalah keyboard matriks sederhana.



Pada gambar dalam lingkaran kuning, angkanya adalah angka dari kontak "horisontal", dan angka pada tombol adalah angka dari kontak "vertikal" pada konektor PBS-13 pada papan keyboard.







Setelah itu, semua ini dilemparkan ke sudut dan dibersihkan selama setahun. Dan kemudian periode isolasi diri dimulai ... Itu menjadi membosankan dan saya ingin melakukan sesuatu dengan tangan saya sendiri, terutama karena tidak ada tempat untuk pergi, dan itu tidak mungkin ...

Pada akhirnya, saya memutuskan untuk mencoba menyelesaikan mainan ini setidaknya sedikit. Papan Arduino diambil sebagai dasar untuk pengontrol, dan karena jumlah gantungan kunci lebih besar dari jumlah pin Arduino UNO, saya memutuskan untuk menggunakan register geser 74HC595 dan 74HC165. Akibatnya, kami mendapat skema seperti itu.



Sirkuit ini awalnya dirakit di papan tempat memotong roti tanpa solder. Untuk menguji operabilitas rangkaian (bahwa tidak ada kesalahan dalam koneksi di mana pun), program uji dikembangkan yang menunjukkan bahwa semuanya tampak berfungsi. Algoritme program uji sederhana: salah satu output dari chip output shift dihidupkan dan nilai dibaca dalam satu siklus dari chip input shift, sambil menekan tombol. Pada pandangan pertama, tidak ada yang meramalkan masalah ... dan semuanya tampak bekerja dengan baik ...



Beberapa hari berikutnya, saya perlahan mengerjakan "pekerjaan rumah," yaitu, dengan hati-hati menyolder semua komponen papan ke papan tempat memotong roti. Saya mengumpulkan semuanya dari apa yang ada di tempat saya. Dia mengambil Arduino NANO sebagai papan kontrol.



"Sandwich" seperti itu dari papan disebabkan oleh kenyataan bahwa dua papan mainan (satu dengan tombol, dan yang lainnya dengan keyboard) terletak pada tingkat yang berbeda, dan sebelum saya menyolder semuanya saya berpikir: "Apakah mungkin entah bagaimana menghubungkannya bersama-sama menggunakan komponen yang saya miliki di rumah terlihat kurang lebih baik? " Dan ternyata desain dua papan ini saling terhubung oleh konektor. Dari sudut pandang saya, untuk opsi rumah, ketika kita duduk sendiri, ternyata cukup baik. Yang harus saya lakukan adalah memotong papan tempat memotong roti dan sedikit memodifikasi tubuh mainan sehingga Anda dapat menghubungkan kabel USB ke papan Arduino.



Kesadaran bahwa perangkat tidak bekerja persis seperti yang saya inginkan datang ketika saya menyelesaikan program pengujian. Algoritma itu sederhana: nyalakan setiap output dari chip 74HC595, dengan mempertimbangkan keadaan input dari chip 74HC165, dan tulis hasilnya dalam variabel yang terpisah. Secara total, 5 output dari 74HC595 terhubung ke keyboard, jadi pada akhirnya saya mendapat 40 bit (5 * 8) data setelah jajak pendapat ini. String 40 bit dikeluarkan ke konsol, dan tombol ditekan untuk melihat bagaimana perangkat menangani penekanan tombol secara bersamaan dari beberapa tombol.



Di sinilah masalah muncul: jika Anda menekan satu tombol, semuanya baik-baik saja, tetapi ketika Anda mencoba untuk menekan lebih dari 2 tombol pada saat yang sama muncul situasi ketika tidak mungkin untuk memprediksi apa yang akan dibaca. Hasilnya bisa benar dengan satu kombinasi, dan dengan yang lain itu bisa benar-benar tidak dapat diprediksi. Masalahnya adalah bahwa fitur skema ini tidak diperhitungkan. Ketika beberapa tombol ditekan pada saat yang sama, tidak hanya beberapa vertikal dari pemindaian keyboard dikunci (ini diperbolehkan), tetapi beberapa garis horizontal dapat ditutup melalui tombol (yang tidak berarti diizinkan). Anda dapat membaca lebih lanjut tentang masalah ini dan bagaimana menyelesaikannya di sini.

Saya memilih "solusi utama" dari masalahnya, yaitu: Saya memutuskan bahwa untuk setiap tombol di keyboard akan ada dioda.

Dalam benak saya, secara mental saya sudah mulai berpikir bagaimana saya harus memotong jejak di papan tulis dan meletakkan dioda di kasing SMD di celah. Saya naik ke ruang penyimpanan dan melihat bahwa saya tidak punya begitu banyak dioda dalam kasing SMD (jangan lupa bahwa kita semua duduk sendiri dan pergi ke toko untuk komponen radio sangat tidak mungkin - karena ini jelas bukan barang yang penting). Sedikit kesal, saya memutuskan untuk melihat lebih dekat pada papan: mungkin untuk menempatkan dioda keluaran pada beberapa trek (saya juga punya beberapa di antaranya). Dan kemudian saya melihat bahwa setiap tombol memiliki jumper (papan satu sisi) dan rangkaian dibuat sehingga alih-alih jumper ini Anda dapat meletakkan dioda. Segera saya pikir - Anda bahkan tidak perlu memotong apa pun, Anda hanya perlu meletakkan dioda keluaran daripada jumper di mana-mana.Saya juga tidak memiliki sejumlah dioda keluaran. Sebuah pemikiran muncul di kepalaku: "mungkin LED?" Rangkaian beroperasi pada +5V dan jika Anda menempatkan LED merah yang memiliki drop tegangan minimum (di antara LED), maka pada akhirnya harus ada tingkat logis untuk penentuan yang benar: kunci ditekan atau tidak.



Dengan pemikiran ini, saya naik ke saham saya lagi dan mengambil LED merah dari mana pun memungkinkan. Ada persis sebanyak tombol pada keyboard! Ini pertanda, saya pikir, dan menyolder beberapa LED alih-alih jumper untuk pengujian. Hasil tes menunjukkan bahwa solusinya bekerja. Setelah itu, saya menyolder LED yang tersisa, bukan jumper. Program pengujian menunjukkan bahwa Anda dapat menekan setidaknya semua tombol pada saat bersamaan, dan semuanya dibaca dengan benar.



Saya memutuskan untuk tidak meletakkan dioda pada tombol tambahan yang ada di mainan, karena tidak mungkin mereka akan ditekan oleh beberapa bagian sekaligus. Selain itu, dalam program ini saya belum memiliki pemrosesan untuk mengklik tombol-tombol ini. Yah, saya belum memutuskan bagaimana cara menggunakannya.

Waktunya telah tiba untuk mencari tahu bagaimana membuat perangkat ini muncul di komputer Anda sebagai keyboard MIDI dan dalam format apa Anda perlu mengirim data.

Informasi yang ditemukan di Internet mengatakan kepada saya bahwa adalah mungkin untuk membuat keyboard MIDI dari Arduino dengan sangat mudah dan hanya dengan menuangkan firmware ke dalamnya, yang akan membuat komputer melihatnya bukan sebagai port COM, tetapi sebagai keyboard MIDI. Awalnya, saya dibimbing oleh keputusan ini , tidak secara khusus membahas bagaimana penerapannya.

Sekarang, ketika saya mendapatkannya dan membacanya dengan saksama, saya menyadari bahwa papan NANO Arduino saya tidak akan cocok untuk solusi ini, karena memiliki port COM berdasarkan chip CH340. Untuk menggunakan firmware dari tautan di atas, hanya kartu-kartu yang memiliki port USB yang sudah ada pada controller (misalnya: AtMega32u4) yang cocok atau komunikasi melalui port COM tidak dilakukan pada chip konversi jenis FT232RL atau sejenisnya, tetapi pada mikrokontroler AtMega. Oleh karena itu, firmware di papan harus mengirim data dalam format MIDI ke port COM, dan pada komputer Anda harus menginstal dan mengkonfigurasi perangkat lunak yang akan mencegat data ini dan mengirimkannya ke port MIDI virtual.
Algoritma untuk membaca kunci dan menghasilkan perintah MIDI adalah sebagai berikut:



Program untuk pengontrol Arduino NANO sekarang terlihat seperti ini.
//    +5V
//   ST_CP  74HC595
#define latchPin      11
//   SH_CP  74HC595
#define clockPin      13
//   DS  74HC595
#define dataPin       12

//     +5V
#define latchPin_IN   9
#define clockPin_IN   10
#define dataPin_IN    8

// ,       1-16    
#define BUT_OUT0      7
#define BUT_OUT1      6
#define BUT_OUT2      5
#define BUT_OUT3      4

byte but_out[4] = {BUT_OUT0, BUT_OUT1, BUT_OUT2, BUT_OUT3};
//       
byte kbd_in[5] = {0, 0, 0, 0, 0};
byte kbd_in_new[5] = {0, 0, 0, 0, 0};

//       
byte btn_in[4] = {0, 0, 0, 0};
byte btn_in_new[4] = {0, 0, 0, 0};

//  3  -   (1 - , 0 - )
byte kbd_out = 0b11100000;

//  
void init_electronics() {
  //  ,   +5V
  //  OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  //  ,   +5V
  pinMode(latchPin_IN, OUTPUT);
  pinMode(clockPin_IN, OUTPUT);
  pinMode(dataPin_IN, INPUT);

  //          
  for (byte i = 0; i < 4; i++) pinMode(but_out[i], OUTPUT);
}

//      74HC595
void write_5V(byte a) {
    digitalWrite(latchPin, LOW);
    //    dataPin
    shiftOut(dataPin, clockPin, MSBFIRST, a); 
     //"" ,      
    digitalWrite(latchPin, HIGH); 
}

void read_5V(byte *btn, byte *kbd) {
  digitalWrite(clockPin_IN, HIGH);
  digitalWrite(latchPin_IN, LOW);
  digitalWrite(latchPin_IN, HIGH);
  
  //    -    
  *btn = shiftIn(dataPin_IN, clockPin_IN, LSBFIRST);
  
  //    -    
  *kbd = shiftIn(dataPin_IN, clockPin_IN, LSBFIRST);
}

void setup() {
  init_electronics();
  write_5V(kbd_out);
  Serial.begin(115200);
}

//       ,   
void read_kbd_and_btn_state(byte *btn, byte *kbd) {
 byte tmp;
  for (byte i = 0; i < 5; i++) {
    write_5V(kbd_out | (1 << i));
    read_5V(&tmp, &kbd[i]);
  }
}

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

//     num  ,   
// 0 -  0,  0
// 1 -  0,  1
// 2 -  1,  1
// 3 -  1,  0
byte compare_bit(byte old_state, byte new_state, byte num) {
  byte tmp_old, tmp_new;
  tmp_old = (old_state >> num) & 1;
  tmp_new = (new_state >> num) & 1;
  if ((tmp_old == 0) && (tmp_new == 0)) return 0;
  if ((tmp_old == 0) && (tmp_new == 1)) return 1;
  if ((tmp_old == 1) && (tmp_new == 1)) return 2; 
  if ((tmp_old == 1) && (tmp_new == 0)) return 3;  
}

void loop() {
  read_kbd_and_btn_state(btn_in_new, kbd_in_new);
  for (byte i = 0; i < 5; i++) {
    for (byte j = 0; j < 8; j++) {
      switch (compare_bit(kbd_in[i], kbd_in_new[i], 7 - j)) {
        //  
        case 1: noteOn(0x90, 0x1D + (8 * i + j), 0x7F);
                break;
        //  
        case 2: //noteOn(0x00, 0x1D + (8 * i + j), 0x7F);
                break;
        //  
        case 3: noteOn(0x90, 0x1D + (8 * i + j), 0x00);
                break;
      }
    }
    kbd_in[i] = kbd_in_new[i];
  }
} 


Tidak masuk akal untuk melukis secara detail cara bekerja dengan data MIDI, karena dapat dibaca di sini.

Saya akan membahas lebih rinci tentang perangkat lunak untuk komputer dan masalah yang saya temui. Masalah muncul, hanya karena kurangnya dokumentasi normal untuk perangkat lunak ini. Jadi, agar komputer dapat berhasil menerima data MIDI dari perangkat seperti milik saya, Anda akan membutuhkan dua program: loopMIDI dan Serial-Midi Converter . Untuk Konial-MIDI Konverter, Anda juga perlu menginstal Java, jika tidak diinstal pada komputer.

Kami memulai program loopMIDI dan membuat dua port virtual. Saya memanggil mereka Arduino IN dan Arduino OUT. Program ini akan menjadi perangkat MIDI virtual.



Selanjutnya, jalankan Serial-MIDI Converter dan saat startup kita pergi melalui proses pengaturannya. Sayangnya, Anda harus melakukan ini setiap kali Anda memulainya, tetapi itu tidak terlalu menakutkan, ini dilakukan secara harfiah dalam empat penekanan tombol pada keyboard. Nomor port COM mungkin berbeda, muncul di komputer ketika papan Arduino NANO terhubung. Kecepatan port diatur dalam firmware Arduino NANO. Panah merah menunjukkan pengaturan saya, di mana semuanya bekerja untuk saya.



Sebenarnya, proses pengaturan telah selesai dan Anda sudah dapat menggunakan beberapa perangkat lunak yang akan memutar suara dengan menerima penekanan tombol dari perangkat. Dalam pengaturan perangkat lunak, Anda harus memilih "Arduino_OUT" sebagai input. Pada gambar di bawah, contoh pengaturan Kontakt Player.



Ini akhirnya bekerja seperti ini:


Apa berikutnya? Dan kemudian semuanya terjadi persis seperti yang saya harapkan - mainan itu tetap menjadi mainan dengan segala kekurangan yang saya sebutkan di awal. Mungkin, anak akan memainkan yang ini dalam gebrakan, tetapi untuk orang dewasa, setelah instrumen keyboard normal ... Lebih mudah untuk membeli keyboard MIDI bekas dengan harga murah dan itu akan jauh lebih baik daripada mainan ini. Saya memutuskan untuk meninggalkan mainan ini apa adanya, tetapi membuat beberapa modifikasi dengan itu:

  1. Tinggalkan case aslinya.
  2. Pasang speaker yang berfungsi dan buat amplifier untuk mereka.
  3. Jadikan itu bekerja dalam mode "mainan anak-anak" tanpa menghubungkan ke komputer, yaitu, sehingga dapat memutar suara itu sendiri.
  4. Buatlah mungkin untuk menghubungkan FootSwitch (pedal yang sama pada piano di bawah) sehingga Anda dapat menahan suara setelah melepaskan tombol, seperti pada instrumen normal.
  5. , .
  6. , -, .



Saya tidak dapat melakukan implementasi sebagian besar poin sementara kita semua bersama-sama "di rumah," karena saya tidak memiliki semua komponen yang diperlukan untuk ini di rumah.

Untuk menerapkan paragraf 3 di Internet, sebuah solusi ditemukan disebut SamplerBox . Inti dari proyek ini adalah Anda dapat menghubungkan keyboard MIDI ke papan Raspberry Pi, yang memproses perintah MIDI dari keyboard dan memainkan suara atau beralih instrumen, dll. Tetap hanya untuk menempatkan papan Raspberry Pi di dalam badan mainan, tanpa kemungkinan mengganti kartu SD (tanpa membongkar kasing), mengkonfigurasi tombol pada badan mainan sehingga mereka beralih alat dan ini akan cukup untuk meninggalkan proyek ini dalam bentuk ini.

Tetapi semua ini akan terjadi setelah periode isolasi diri berakhir.

Saya harap seseorang akan menemukan pengalaman saya yang berguna.

All Articles