Daftar Isi:

EAL - Pengontrol MIDI Arduino: 7 Langkah
EAL - Pengontrol MIDI Arduino: 7 Langkah

Video: EAL - Pengontrol MIDI Arduino: 7 Langkah

Video: EAL - Pengontrol MIDI Arduino: 7 Langkah
Video: Как сделать модуль электрического барабана из джойстика 2024, Juli
Anonim
EAL - Pengontrol MIDI Arduino
EAL - Pengontrol MIDI Arduino

Dibuat oleh Søren stergaard Petersen, OEAAM16EDA

Instruksi ini menjelaskan pengontrol MIDI berbasis arduino. Ini adalah proyek sekolah. Dengan menggunakan tangan Anda, Anda dapat memainkan melodi sederhana melalui koneksi MIDI dan instrumen MIDI yang terhubung (atau seperti dalam hal ini notebook yang menjalankan perangkat lunak softsynth). Anda dapat memainkan nada dari tangga nada C mayor, c-d-e-f-g-a-b-c. Untuk dapat menghubungkan pengontrol MIDI ke notebook, Anda memerlukan antarmuka MIDI ke USB seperti m-audio Uno.

Langkah 1: Video Demonstrasi

Image
Image

Naikkan volume dan nikmatilah!

Bagaimana itu bekerja:

Kontroler MIDI menggunakan papan Arduino MEGA 2560. Dua sensor cahaya (LDR) yang terpasang pada tabung listrik 16mm membentuk sistem sensor ganda dan digunakan untuk membuat pemicu stabil tanpa pemicu ganda palsu. Sebuah senter menciptakan berkas cahaya, ketika sinar itu terganggu oleh tangan yang memainkan pengontrol, sensor cahaya yang lebih rendah merasakan sinar yang hilang, dan sensor ultrasonik HC-SR04 mengukur jarak dari sensor ke tangan.

Jarak yang diukur digunakan dalam program Arduino untuk menghitung dan mengatur nilai nomor not yang sesuai untuk dikemas ke dalam pesan dan pemancar MIDI Note On pada antarmuka MIDI. Antarmuka keluaran MIDI menggunakan inverter hex 74HC14 dan merupakan rangkaian standar. Komunikasi MIDI menggunakan serial1, port serial standar digunakan untuk debugging.

Ketika tangan digerakkan lurus ke atas dan menjauhi berkas cahaya, sensor cahaya atas merasakan berkas cahaya lagi dan pesan MIDI Note Off dikemas dan ditransmisikan pada output MIDI.

Area bermain di antara sensor sekitar 63cm, dan panjang total pengontrol MIDI sekitar 75cm.

Langkah 2: Detail Sensor Cahaya

Detail Sensor Cahaya
Detail Sensor Cahaya
Detail Sensor Cahaya
Detail Sensor Cahaya

Kedua sensor cahaya dipasang di atas satu sama lain untuk membentuk sistem sensor ganda. Ini mencegah pemicu palsu ketika digunakan dengan benar dalam perangkat lunak. Setiap sensor cahaya terdiri dari modul resistor foto yang dibangun ke dalam tabung listrik standar 16 mm. Sebuah slot dibuat di setiap tabung dengan gergaji besi dan PCB foto resistor dapat ditekan ke dalam slot. Sensor direkatkan dengan selotip dan juga dipasang di salah satu ujung kayu. Tidak ada cahaya yang dapat mencapai sensor dari belakang. Sensor cahaya memiliki resistor pull-up 10k.

Langkah 3: Detail Sensor Ultrasonik HC-SR04

Detail Sensor Ultrasonik HC-SR04
Detail Sensor Ultrasonik HC-SR04

Sensor ultra sonik HC-SR04 dipasang di ujung lain pengontrol MIDI. Senter terang ditempatkan di sini juga, itu menciptakan sinar yang diperlukan.

Langkah 4: Sirkuit Aduino

Sirkuit Aduino
Sirkuit Aduino
Sirkuit Aduino
Sirkuit Aduino

Rangkaian output MIDI pada dasarnya adalah inverter hex 74HC14 standar dan beberapa resistor ditambah konektor 5 pin DIN female. Sirkuit 74HC14 menggerakkan output MIDI dan pada saat yang sama memberikan beberapa sarana perlindungan untuk papan Arduino terhadap "dunia nyata" yang terhubung ke MIDI keluar. Fitur ekstra praktis adalah LED aktivitas MIDI yang memberi sinyal saat data dikirim.

Saya telah menggunakan prototipe PCB yang tepat untuk perangkat keras saya karena saya memiliki banyak masalah dengan koneksi yang buruk pada papan tempat memotong roti saya. Skema dibuat di Fritzing, salinan pdf resolusi tinggi dapat diunduh dengan menekan tautan di bawah ini. Saya lebih suka menggunakan program skema yang tepat seperti Kicad, saya pikir Fritzing terbatas untuk apa pun kecuali eksperimen yang paling sederhana.

Bahan-bahan yang digunakan:

1 buah Arduino MEGA 2560

2 buah Photo resistor (LDR) dengan resistor pull up built-in (dari 37 kit sensor)

1 buah sensor ultrasonik HC-SR04

1 pcs 74HC14 hex pembalik Schmitt pemicu

2 buah resistor 220 Ohm 0.25W

1 buah resistor 1k Ohm 0.25W

1 pcs LED arus rendah 2mA

1 buah kapasitor keramik 100nF (untuk decoupling catu daya, langsung di pin daya 74HC14)

Papan tempat memotong roti atau prototipe PCB

2 pcs 16mm tabung listrik, panjang 65mm

1 buah kayu, panjang 75cm

Lakban

kabel

Langkah 5: Daftar I/O

Daftar I/O
Daftar I/O

Langkah 6: Kode Aduino

Sketsa test_Midi6 menggunakan perpustakaan NewPing yang harus Anda sertakan dalam lingkungan pemrograman Arduino Anda, untuk menggunakan sensor ultrasonik HC-SC04. Sketsa dikomentari dalam bahasa Denmark, maaf.. Untuk menjaga agar sketsa tetap terstruktur dengan baik, fungsi terpisah dibuat untuk bagian logika sketsa yang berbeda dan variabel global sebagian besar dihindari. Alur program divisualisasikan dalam diagram alur pengontrol MIDI pdf.

// Versi 15-05-2017: test_Midi6

// Søren stergaard Petesen // Arduino MEGA 2560 // Dette program udgør en simpel MIDI controller som kan styre en ekstern MIDI enhed, f.eks en softsynt på en PC. // Kontroler MIDI kan sende toneanslag (catatan tentang kommando) hhv. (note off kommando) untuk en oktav C-C, C dur skala. // Der spilles med en "karate hånd" på et brædt // hvor sensorerne er monteret. MIDI kommandoerne memicu af en dobbelt LDR sensor, da der skal laves en sikker // detektering af både når hånden lander på brættet (note on), samt når hånden fjernes igen (note off). // MIDI kommandoerne "note on" atau "note off" terbaik untuk 3 byte yang dikirim untuk serial1 porten // untuk mengetahui perangkat keras yang mendukung antarmuka MIDI. // Tonehøjden bestemmes vha ultralydssensor HC-SR04 #include // bibliotek til den anvendte ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Arduino pin til trigger pin på sensor ultrasonik #define ECHO_PIN 2 // Arduino pin til echo pin på sensor ultrasonik # define MAX_DISTANCE 100 // Afstand maksimum untuk Ping #define Median 5 // Antal målinger der beregnes gennemsnit af for at få en sikker afstandsbestemmelse NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Membuat Objek NewPing. int Senspin1 = 53; //Bawah LDR1 føler int Senspin2 = 52; //Øverste LDR2 føler byte MIDIByte2; //deklarasi variabel untuk MIDIByte2 bool klar_note_on = 1; //Deklarasi variabel untuk klar_note_on, styrer afsendelse af note di kommando. Første kommando er en note di kommando bool klar_note_off = 0; //Deklarasi variabel untuk klar_note_off, styrer afsendelse af note off kommando void setup() { pinMode(Senspin1, INPUT); // st input sensor pinMode(Senspin2, INPUT); // st input sensor Serial1.begin(31250); // Bruges Serial1 hingga komunikasi MIDI: 31250 bit/sekundt Serial.begin(9600); //monitor serial, til test } void loop() { bool Sensor1 = digitalRead(Senspin1); //Ls LDR1 - underte LDR bool Sensor2 = digitalRead(Senspin2); //læs LDR2 - verste LDR if (Sensor1 && klar_note_on) //hvis LDR1 aktif dan klar hingga not pada { byte Note_Byte = Hent_tonehojde(); //Hent tone højde melalui sensor ultralyds MIDIByte2 = Hent_MidiByte2(Note_Byte); // Hent MidByte2, nomor catatan MIDI, værdien 0xFF er di luar jangkauan Send_Note_On(MIDIByte2); // kald Send_Note_On funktion klar_note_on = 0; // der skal kun sendes en note on kommando klar_note_off = 1; // næste kommando er note off } if (Sensor2 && !Sensor1 && klar_note_off) // Hvis der skal mengirim note off kommando gøres det her.. { Send_Note_Off(MIDIByte2); // kirim nota kommando klar_note_off = 0; // der skal kun sendes en note off kommando } if (!Sensor1 && !Sensor2) // her gøres klar til ny note on kommando, hånd er væk fra brædt { klar_note_on = 1; } } byte Hent_MidiByte2(byte NoteByte) { // Gunakan nomor not MIDI yang mengembalikan fungsi, nilai dari NoteByte byte MIDIB2; switch (NoteByte) // her defineres hvilken værdi MIDIByte2 skal have fra værdien af Note_Byte { case 0: { MIDIB2 = 0x3C; // nada 'C' } istirahat; kasus 1: { MIDIB2 = 0x3E; // nada 'D' } istirahat; kasus 2: { MIDIB2 = 0x40; // nada 'E' } istirahat; kasus 3: { MIDIB2 = 0x41; // nada 'F' } istirahat; kasus 4: { MIDIB2 = 0x43; // nada 'G' } istirahat; kasus 5: { MIDIB2 = 0x45; // nada 'A' } istirahat; kasus 6: { MIDIB2 = 0x47; // nada 'B' } istirahat; kasus 7: { MIDIB2 = 0x48; // nada 'C' } istirahat; default: { MIDIB2 = 0xFF; // di luar jangkauan } } kembalikan MIDIB2; //returner MIDI note number } byte Hent_tonehojde() { //Fungsi Denne kemudian resultatet af ultralydsmålingen unsigned int Tid_uS; // målt tid i us byte Afstand; // beregnet afstand i cm byte resultat; // inddeling af spille område const float Omregningsfaktor = 58.3; // 2*(1/343 m/s)/100 = 58, 3uS/cm, der ganges med 2 da tiden er summen af tiden frem og tilbage. Tid_uS = sonar.ping_median(Median); // Kirim ping, få tid retur i uS, gennemsint af Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = rentang jarak luar) resultat = Afstand / 8; //Beregn resultat kembali resultat; //Returner resultat } void Send_Note_On(byte tonenr) { //Mengisi fungsi pengirim dan catatan pada kommando på Antarmuka MIDI const byte kommando = 0x90; //Catatan tentang kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Kecepatan = 127 Serial1.write(kommando); //kirim catatan di kommando Serial1.write(tonenr); //kirim nomor nada Serial1.write(volumen); //send volumen (velocity) } void Send_Note_Off(byte tonenr) {//Denne funktion sender note off kommando på Antarmuka MIDI const byte kommando = 0x80; //Catatan kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / Kecepatan = 127 Serial1.write(kommando); //kirim nota kommando Serial1.write(tonenr); //kirim nomor nada Serial1.write(volumen); //mengirim volumen (kecepatan) }

Langkah 7: Dasar-dasar Komunikasi MIDI

MIDI (Musical Instrument Digital Interface) adalah protokol komunikasi serial universal untuk antarmuka alat musik elektronik dan perangkat lainnya. Komunikasi serial digunakan (31250 bit/s, media transmisi adalah loop arus, opto-terisolasi di ujung penerima. Konektor DIN 5pin digunakan. 16 saluran komunikasi logis dimungkinkan dalam satu koneksi MIDI fisik. Banyak perintah didefinisikan dalam MIDI standar, saya menggunakan dua perintah dalam proyek ini, perintah ini terdiri dari 3 byte:

a) Catatan Pada perintah:

1. byte send = 0x90 artinya catatan pada perintah pada saluran MIDI 1

2. byte send = 0xZZ ZZ adalah nomor catatan, saya menggunakan rentang 0x3C hingga 0x48

3. byte send =0xFF FF = 255 yang berarti volume maksimal, rentang 0x00 hingga 0xFF

b) Perintah Catatan Mati:1. byte send = 0x80 artinya perintah note off pada saluran MIDI 1

2. byte send = 0xZZ ZZ adalah nomor catatan, saya menggunakan rentang 0x3C hingga 0x48

3. byte send =0xFF FF = 255 artinya volume maksimal, rentang 0x00 hingga 0xFF

Direkomendasikan: