Πώς να φτιάξετε έναν φτηνό ελεγκτή MIDI με βάση το Arduino με τα χέρια σας. Πύλη πληροφοριών ασφαλείας

Ένδειξη πατήματος πλήκτρων

Χρησιμοποιούμε μια έγχρωμη λωρίδα LED για να υποδείξουμε τον αριθμό και τη δύναμη πατήματος ενός πλήκτρου συνθεσάιζερ.

Θα χρειαστείτε:

midi-ledStrip.ino #include #περιλαμβάνω #ifdef __AVR__ #include #τέλος εαν // Λωρίδα LED συνδεδεμένη στον ακροδέκτη 11#define PIN 11 // Αποτελείται από 50 LED#define NUMPIXELS 50 // Δημιουργία αντικειμένου για τον έλεγχο της ροής Adafruit_NeoPixel pixel = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800) ; // Δημιουργία αντικειμένου για επικοινωνία MIDI μέσω Serial1 MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, myMidi) ; // Βοηθητικές μεταβλητές int r, g, b, pitchPot; // Λειτουργία που μετατρέπει την απόχρωση σε RGB. // Λεπτομέρειες: http://site/projects:christmastree void f_HSV_to_RGB(int hue, int sat, int val) ( int base; if (sat == 0) ( r = val; g = val; b = val; ) other ( base = ((255 - sat) * val) >> 8 ; διακόπτης (απόχρωση / 60 ) (περίπτωση 0 : ( r = val; g = ((val - βάση) * απόχρωση) / 60 ) + βάση; b = βάση; σπάσιμο ; ) περίπτωση 1 : ( r = ((val - βάση) * (60 - (απόχρωση % 60) ) / 60 ) + βάση; g = βάση; σπάσιμο; ((val - βάση) * (απόχρωση % 60 ) ) / 60 ) + διάλειμμα ) περίπτωση 3: ( r = βάση; g = (((val - βάση) * (60 - (απόχρωση % 60 ) ) ) / 60 ) + βάση; b = val; σπάσιμο; ) περίπτωση 4: ( r = ((( val-base) * (hue % 60 ) ) + g = val ) case 5 : ( r = val; g = base; (60 - (απόχρωση % 60) ) / 60 ) + βάση ) περίπτωση 6 : (r = val; g = 0 ; b = βάση ; // Πρόγραμμα χειρισμού συμβάντων NoteOn. Αυτή η λειτουργία θα κληθεί αυτόματα όταν // όταν λαμβάνετε ένα μήνυμα NoteOn μέσω εισόδου MIDI. void handleNoteOn (κανάλι byte, βήμα byte, ταχύτητα byte) ( // Η ταχύτητα κυμαίνεται από 0 έως 127 // Για να αποφύγετε τη μείωση του εύρους τιμών χρωματικής απόχρωσης (0-255), // μετατοπίζουμε προς τα αριστερά και πολλαπλασιάζουμε τη δύναμη πίεσης επί 2. byte doubleVelocity = ταχύτητα<< 1 ; // Μετατροπή της απόχρωσης σε RGB f_HSV_to_RGB(doubleVelocity, 255 , 255 ); // Ο αριθμός της σημείωσης έχει τιμή από 0 έως 127, // και υπάρχουν μόνο 50 LED έτσι ώστε η ταινία να εμφανίζει σημειώσεις // στο απαιτούμενο διάστημα, προσαρμόστε την ταινία στις επιθυμητές νότες χρησιμοποιώντας το ποτενσιόμετρο. // Η ανάγνωση της τιμής από το ποτενσιόμετρο εμφανίζεται στο loop(); int activePitch = pitch - pitchPot; // Ρυθμίστε το χρώμα LED στην επιθυμητή θέση... pixels.setPixelColor(activePitch, pixels.Color(r, g, b)); // ... και ανάψτε την ταινία. pixels.show(); ) // Πρόγραμμα χειρισμού συμβάντων NoteOff. Αυτή η λειτουργία θα κληθεί αυτόματα όταν // όταν λαμβάνετε ένα μήνυμα NoteOff μέσω εισόδου MIDI. // Περισσότερες λεπτομέρειες: http://arduinomidilib.fortyseveneffects.com/a00022.html void handleNoteOff (κανάλι byte, βήμα byte, ταχύτητα byte) ( // Σβήστε το LED που άναψε το NoteOn int activePitch = pitch - pitchPot; pixels.setPixelColor(activePitch, pixels.Color(0, 0, 0)); pixels.show(); ) void setup() ( // Εκκίνηση της λωρίδας LED... pixels.begin(); // ... και απενεργοποιήστε όλα τα LED pixels.show(); // Επισυνάψτε το πρόγραμμα χειρισμού συμβάντων NoteOn myMidi.setHandleNoteOn (handleNoteOn) ; // Επισυνάψτε το πρόγραμμα χειρισμού συμβάντων NoteOff myMidi.setHandleNoteOff (handleNoteOff) ; // Εκκινήστε τη διεπαφή MIDI για να ακούσετε όλους// Κανάλια MIDI. myMidi.begin(MIDI_CHANNEL_OMNI) ; ) void loop() ( // Εδώ καλούμε απλώς το MIDI.read, // η βιβλιοθήκη θα κάνει τα υπόλοιπα μόνη της myMidi.read(); // Διαβάστε την τιμή από το ποτενσιόμετρο. // Χρειαζόμαστε μια τιμή στο εύρος (0-127), // μπορεί να ληφθεί από την περιοχή (0-1024) μετατοπίζοντας 3 bit προς τα δεξιά pitchPot = analogRead(A4) >> 3 ; )

Για άλλη μια φορά, παίζοντας κιθάρα και ελέγχοντας τον ήχο μέσω του Peavey ReValver και άλλων Amplitube, σκέφτηκα να αγοράσω ένα χειριστήριο MIDI. Οι επώνυμες συσκευές, όπως το Guitar Rig Kontrol 3, κοστίζουν περίπου 13.000 ρούβλια και είναι μόνο στο δάπεδο. Δηλαδή, η γρήγορη αλλαγή των θέσεων πολλών ρυθμιστικών αρχών είναι πολύ προβληματική.

Διάφοροι ελεγκτές κατεύθυνσης DJ φαίνονταν πιο ενδιαφέροντες λόγω της αφθονίας των faders και των κωδικοποιητών. Αποφασίστηκε να συνδυάσω τις επιχειρήσεις με την ευχαρίστηση και να φτιάξω μόνος μου έναν ελεγκτή MIDI.

Αρχικές απαιτήσεις: 2-7 fader, ίδιος αριθμός περιστροφικών ποτενσιόμετρων/κωδικοποιητών, περίπου 10 κουμπιά, σύνδεση USB.

Στη συνέχεια άρχισα να επιλέγω εξαρτήματα. Επέλεξα το Arduino λόγω της διαθεσιμότητάς του καταρχήν, μπορείτε να χρησιμοποιήσετε το ίδιο ATmega32u4, STM ή άλλο ελεγκτή. Βρήκα τα faders και τα κουμπιά σε ένα τοπικό κατάστημα ραδιοφώνου. Ο κωδικοποιητής και τα ποτενσιόμετρα είχαν ήδη αγοραστεί κάποια στιγμή. Βρήκα τους διακόπτες εναλλαγής στο γκαράζ. Αποφάσισα να φτιάξω τη θήκη από το επάνω εξώφυλλο ενός DVD player.

Αξεσουάρ:

  • Arduino UNO R3 1 τεμ.
  • Faders sp3-25a 5 τεμ.
  • Στόμα. ποτενσιόμετρα 3 τεμ.
  • Κωδικοποιητής 1 τεμ.
  • Κουμπιά pbs-26b 16 τεμ.
  • Κάλυμμα DVD 1 τεμ.
  • Διακόπτες εναλλαγής 2 τεμ.

Πρώτα, λύγισα το σώμα και πριόνισα τρύπες σε αυτό με ένα τρυπάνι για τα fader:

Στη συνέχεια άνοιξα τις τρύπες για τους διακόπτες εναλλαγής και το στόμιο. ποτενσιόμετρα, σημείωσαν τη θέση των κουμπιών. Δεδομένου ότι δεν είχα τρυπάνι 19 χιλιοστών (ή ακόμη και αντίστοιχο τσοκ), άνοιξα τις τρύπες για τα κουμπιά στα 13 χιλιοστά και μετά τα μεγέθυναν με ένα σφουγγάρι.

Η βάση είναι έτοιμη, τώρα μπορείτε να σκεφτείτε πώς να συνδέσετε όλα αυτά τα πράγματα στο Arduino. Κατά τη μελέτη αυτού του τεύχους έπεσα πάνω σε ένα υπέροχο έργο HIDUINO. Αυτό είναι το υλικολογισμικό για το ATmega16u2 στο Arduino, χάρη στο οποίο η συσκευή ορίζεται ως συσκευή USB-HID MIDI. Το μόνο που μπορούμε να κάνουμε είναι να στείλουμε δεδομένα MIDI μέσω UART στα 31250 baud. Για να μην γεμίσω τον πηγαίο κώδικα με ορισμούς με κωδικούς συμβάντων MIDI, χρησιμοποίησα αυτήν τη βιβλιοθήκη.

Επειδή χρησιμοποίησα το Arduino, αποφάσισα να φτιάξω μια ασπίδα στην οποία θα συνδέονται όλα τα περιφερειακά.
Σχέδιο ασπίδας:

Όπως μπορείτε να δείτε από το διάγραμμα, τα κουμπιά συνδέονται χρησιμοποιώντας ένα κύκλωμα μήτρας. Χρησιμοποιούνται οι ενσωματωμένες pull-up αντιστάσεις του ATmega328, οπότε η λογική είναι αντίστροφη.

Κουμπιά αρχικοποίησης

for(byte i = 0; i< COLS; i++){ //--Конфигурируем строки мтрчн клвтр как выходы pinMode(colPins[i], OUTPUT); //--подаём на них лог. 1 digitalWrite(colPins[i], HIGH); } for(byte i = 0; i < ROWS; i++){ //--Конфигурируем столбцы мтрчн клвтр как входы--------- pinMode(rowPins[i], INPUT); //--включаем встроенные в мк подтягивающие резисторы-- digitalWrite(rowPins[i], HIGH); }

Αξίες ανάγνωσης

for(byte i = 0; i< COLS; i++) //-Цикл чтения матричной клавиатуры----- { digitalWrite(colPins[i], LOW); //--На считываемый столбец выставляем 0--- for(byte j = 0; j < ROWS; j++) //--Построчно считываем каждый столбец-- { //--И при нажатой кнопке передаём ноту-- dval=digitalRead(rowPins[j]); if (dval == LOW && buttonState[i][j] == HIGH) MIDI.sendNoteOn(kpdNote[j][i],127,1); if (dval == HIGH && buttonState[i][j] == LOW) MIDI.sendNoteOff(kpdNote[j][i],127,1); buttonState[i][j] = dval; } digitalWrite(colPins[i], HIGH); }




Ξέχασα να τοποθετήσω διόδους στη σφραγίδα, έπρεπε να τις κολλήσω στα κουμπιά.

Τα ποτενσιόμετρα συνδέονται μέσω πολυπλέκτη 4052b στις εισόδους ADC.

Ανάγνωση θέσεων ποτενσιόμετρου

for(byte chn = 0; chn< 4; chn++) //-Цикл чтения значений потенциометров { set_mp_chn(chn); //--Задаём параметры мультиплексора val=analogRead(0) / 8; //--Считываем значение с канала X if (abs(val-PrVal) >5) //--Αν η τρέχουσα τιμή είναι ex. από το παρελθόν ( //-- περισσότερες από 5, στη συνέχεια στείλτε μια νέα τιμή MIDI.sendControlChange(chn,val,1); PrVal=val; ) val=analogRead(1) / 8; //--Διαβάστε την τιμή από το κανάλι Y με τον ίδιο τρόπο όπως το X εάν (abs(val-PrVal) > 5) ( MIDI.sendControlChange(chn+4,val,1); PrVal=val; ) )


Ο κωδικοποιητής ορίστηκε σε διακοπή υλικού.

Διαβάζοντας τον κωδικοποιητή

void enc() // Επεξεργασία κωδικοποιητή (currenttime=millis(); if (abs(ltime-currenttime)>50) // anti-bounce (b=digitalRead(4); if (b == HIGH && eval<=122) eval=eval+5; else if (b == LOW && eval>=5) eval=eval-5; MIDI.sendControlChange(9,eval,1); ltime = millis(); ) )


Έστρωσα την πλακέτα τυπωμένου κυκλώματος σε διάταξη Sprint και μετά την έφτιαξα με την παλιά καλή LUT χρησιμοποιώντας αυτοκόλλητη μεμβράνη και χλωριούχο σίδηρο Η ποιότητα της συγκόλλησης υποφέρει από τρομερή συγκόλληση.

Έτοιμη ασπίδα:



Για να ανεβάσω υλικολογισμικό στο ATmega32u4, βραχυκύκλωσα 2 ακίδες ICSP και μετά χρησιμοποίησα το Flip. Αργότερα σύνδεσα ένα κουμπί σε αυτές τις ακίδες.

Το υλικολογισμικό λειτουργεί, το μόνο που μένει είναι να βιδώσετε τους τοίχους και πρόσοψη. Δεδομένου ότι σημείωσα τα πάντα στη θέση τους, η σχεδίαση του πίνακα χρειάστηκε περισσότερο χρόνο από οτιδήποτε άλλο. Έμοιαζε κάπως έτσι:

  • 1. Ως φόντο της εικόνας χρησιμοποιήθηκε γραφικό χαρτί
  • 2. Σημειώθηκαν τρύπες
  • 3. Το αποτέλεσμα εκτυπώθηκε
  • 4. Όλες οι τρύπες κόπηκαν
  • 5. Όλα τα στοιχεία ξεβιδώθηκαν και αφαιρέθηκαν
  • 6. Ο πίνακας εγκαταστάθηκε, όλα τα κουμπιά/ποτενσιόμετρα τοποθετήθηκαν στη θέση τους
  • 7. Υπήρχαν ασυνέπειες μεταξύ του προτύπου και του σώματος
  • 8. Πηγαίνετε στο βήμα 2 μέχρι να ταιριάζουν όλες οι τρύπες
Το πάνελ είναι κατασκευασμένο από PET χιλιοστού, καλυμμένο με τυπωμένη και πλαστικοποιημένη μεμβράνη, οι τρύπες κόβονται με λέιζερ σύμφωνα με αρχείο cdr. Από τους διαφημιστές του Ιρκούτσκ, όλα αυτά μου κόστισαν μόνο 240 ρούβλια.

Τα πλαϊνά τοιχώματα κόπηκαν από κόντρα πλακέ.

Τρέχων τύπος συσκευής:

Κόστος εξαρτημάτων:

  • Arduino UNO R3 RUR 320
  • Faders sp3-25a 5x9=45 r.
  • Στόμα. ποτενσιόμετρα + πόμολα 85 τρίψτε.
  • Κωδικοποιητής 15 rub.
  • Κουμπιά pbs-26b 16x19=304 τρίψιμο.
  • Πάνελ 240 τρίψτε.
  • Πολυπλέκτης 16 τρίψιμο.
  • Κόντρα πλακέ, textolite, διακόπτες εναλλαγής, θήκη DVD - στην περίπτωσή μου, δωρεάν.
Σύνολο: 1025 τρίψτε.

Ο ελεγκτής αντιμετωπίζει τις εργασίες που του έχουν ανατεθεί και ελέγχει τον ήχο σχεδόν σε οποιοδήποτε πρόγραμμα επεξεργασίας ήχου.

Τα σχέδια είναι να καλύψετε το κόντρα πλακέ με λεκέ και να κόψετε το κάτω κάλυμμα από πλεξιγκλάς. Προσθέστε επίσης μια θύρα επέκτασης για να συνδέσετε έναν ελεγκτή δαπέδου.

Κωδικός για το Arduino και υπογραφή στο Github.

Για άλλη μια φορά, παίζοντας κιθάρα και ελέγχοντας τον ήχο μέσω του Peavey ReValver και άλλων Amplitube, σκέφτηκα να αγοράσω ένα χειριστήριο MIDI. Οι επώνυμες συσκευές, όπως το Guitar Rig Kontrol 3, κοστίζουν περίπου 13.000 ρούβλια και είναι μόνο στο δάπεδο. Δηλαδή, η γρήγορη αλλαγή των θέσεων πολλών ρυθμιστικών αρχών είναι πολύ προβληματική.

Διάφοροι ελεγκτές κατεύθυνσης DJ φαίνονταν πιο ενδιαφέροντες λόγω της αφθονίας των faders και των κωδικοποιητών. Αποφασίστηκε να συνδυάσω τις επιχειρήσεις με την ευχαρίστηση και να φτιάξω μόνος μου έναν ελεγκτή MIDI.

Αρχικές απαιτήσεις: 2-7 fader, ίδιος αριθμός περιστροφικών ποτενσιόμετρων/κωδικοποιητών, περίπου 10 κουμπιά, σύνδεση USB.

Στη συνέχεια άρχισα να επιλέγω εξαρτήματα. Επέλεξα το Arduino λόγω της διαθεσιμότητάς του καταρχήν, μπορείτε να χρησιμοποιήσετε το ίδιο ATmega32u4, STM ή άλλο ελεγκτή. Βρήκα τα faders και τα κουμπιά σε ένα τοπικό κατάστημα ραδιοφώνου. Ο κωδικοποιητής και τα ποτενσιόμετρα είχαν ήδη αγοραστεί κάποια στιγμή. Βρήκα τους διακόπτες εναλλαγής στο γκαράζ. Αποφάσισα να φτιάξω τη θήκη από το επάνω εξώφυλλο ενός DVD player.

Αξεσουάρ:

  • Arduino UNO R3 1 τεμ.
  • Faders sp3-25a 5 τεμ.
  • Στόμα. ποτενσιόμετρα 3 τεμ.
  • Κωδικοποιητής 1 τεμ.
  • Κουμπιά pbs-26b 16 τεμ.
  • Κάλυμμα DVD 1 τεμ.
  • Διακόπτες εναλλαγής 2 τεμ.

Πρώτα, λύγισα το σώμα και πριόνισα τρύπες σε αυτό με ένα τρυπάνι για τα fader:

Στη συνέχεια άνοιξα τις τρύπες για τους διακόπτες εναλλαγής και το στόμιο. ποτενσιόμετρα, σημείωσαν τη θέση των κουμπιών. Δεδομένου ότι δεν είχα τρυπάνι 19 χιλιοστών (ή ακόμη και αντίστοιχο τσοκ), άνοιξα τις τρύπες για τα κουμπιά στα 13 χιλιοστά και μετά τα μεγέθυναν με ένα σφουγγάρι.

Η βάση είναι έτοιμη, τώρα μπορείτε να σκεφτείτε πώς να συνδέσετε όλα αυτά τα πράγματα στο Arduino. Καθώς διάβαζα Αυτό το θέμαΒρήκα ένα υπέροχο έργο HIDUINO. Αυτό είναι το υλικολογισμικό για το ATmega16u2 στο Arduino, χάρη στο οποίο η συσκευή ορίζεται ως συσκευή USB-HID MIDI. Το μόνο που μπορούμε να κάνουμε είναι να στείλουμε δεδομένα MIDI μέσω UART στα 31250 baud. Για να μην γεμίσω τον πηγαίο κώδικα με ορισμούς με κωδικούς συμβάντων MIDI, χρησιμοποίησα αυτήν τη βιβλιοθήκη.

Επειδή χρησιμοποίησα το Arduino, αποφάσισα να φτιάξω μια ασπίδα στην οποία θα συνδέονται όλα τα περιφερειακά.
Σχέδιο ασπίδας:

Όπως μπορείτε να δείτε από το διάγραμμα, τα κουμπιά συνδέονται χρησιμοποιώντας ένα κύκλωμα μήτρας. Χρησιμοποιούνται οι ενσωματωμένες pull-up αντιστάσεις του ATmega328, οπότε η λογική είναι αντίστροφη.

Κουμπιά αρχικοποίησης

for(byte i = 0; i< COLS; i++){ //--Конфигурируем строки мтрчн клвтр как выходы pinMode(colPins[i], OUTPUT); //--подаём на них лог. 1 digitalWrite(colPins[i], HIGH); } for(byte i = 0; i < ROWS; i++){ //--Конфигурируем столбцы мтрчн клвтр как входы--------- pinMode(rowPins[i], INPUT); //--включаем встроенные в мк подтягивающие резисторы-- digitalWrite(rowPins[i], HIGH); }

Αξίες ανάγνωσης

for(byte i = 0; i< COLS; i++) //-Цикл чтения матричной клавиатуры----- { digitalWrite(colPins[i], LOW); //--На считываемый столбец выставляем 0--- for(byte j = 0; j < ROWS; j++) //--Построчно считываем каждый столбец-- { //--И при нажатой кнопке передаём ноту-- dval=digitalRead(rowPins[j]); if (dval == LOW && buttonState[i][j] == HIGH) MIDI.sendNoteOn(kpdNote[j][i],127,1); if (dval == HIGH && buttonState[i][j] == LOW) MIDI.sendNoteOff(kpdNote[j][i],127,1); buttonState[i][j] = dval; } digitalWrite(colPins[i], HIGH); }




Ξέχασα να τοποθετήσω διόδους στη σφραγίδα, έπρεπε να τις κολλήσω στα κουμπιά.

Τα ποτενσιόμετρα συνδέονται μέσω πολυπλέκτη 4052b στις εισόδους ADC.

Ανάγνωση θέσεων ποτενσιόμετρου

for(byte chn = 0; chn< 4; chn++) //-Цикл чтения значений потенциометров { set_mp_chn(chn); //--Задаём параметры мультиплексора val=analogRead(0) / 8; //--Считываем значение с канала X if (abs(val-PrVal) >5) //--Αν η τρέχουσα τιμή είναι ex. από το παρελθόν ( //-- περισσότερες από 5, στη συνέχεια στείλτε μια νέα τιμή MIDI.sendControlChange(chn,val,1); PrVal=val; ) val=analogRead(1) / 8; //--Διαβάστε την τιμή από το κανάλι Y με τον ίδιο τρόπο όπως το X εάν (abs(val-PrVal) > 5) ( MIDI.sendControlChange(chn+4,val,1); PrVal=val; ) )


Ο κωδικοποιητής ορίστηκε σε διακοπή υλικού.

Διαβάζοντας τον κωδικοποιητή

void enc() // Επεξεργασία κωδικοποιητή (currenttime=millis(); if (abs(ltime-currenttime)>50) // anti-bounce (b=digitalRead(4); if (b == HIGH && eval<=122) eval=eval+5; else if (b == LOW && eval>=5) eval=eval-5; MIDI.sendControlChange(9,eval,1); ltime = millis(); ) )


Έστρωσα την πλακέτα τυπωμένου κυκλώματος σε διάταξη Sprint και μετά την έφτιαξα με την παλιά καλή LUT χρησιμοποιώντας αυτοκόλλητη μεμβράνη και χλωριούχο σίδηρο Η ποιότητα της συγκόλλησης υποφέρει από τρομερή συγκόλληση.

Έτοιμη ασπίδα:



Για να ανεβάσω υλικολογισμικό στο ATmega32u4, βραχυκύκλωσα 2 ακίδες ICSP και μετά χρησιμοποίησα το Flip. Αργότερα σύνδεσα ένα κουμπί σε αυτές τις ακίδες.

Το υλικολογισμικό λειτουργεί, το μόνο που μένει είναι να βιδώσετε τους τοίχους και τον μπροστινό πίνακα. Δεδομένου ότι σημείωσα τα πάντα στη θέση τους, η σχεδίαση του πίνακα χρειάστηκε περισσότερο χρόνο από οτιδήποτε άλλο. Έμοιαζε κάπως έτσι:

  • 1. Ως φόντο της εικόνας χρησιμοποιήθηκε γραφικό χαρτί
  • 2. Σημειώθηκαν τρύπες
  • 3. Το αποτέλεσμα εκτυπώθηκε
  • 4. Όλες οι τρύπες κόπηκαν
  • 5. Όλα τα στοιχεία ξεβιδώθηκαν και αφαιρέθηκαν
  • 6. Ο πίνακας εγκαταστάθηκε, όλα τα κουμπιά/ποτενσιόμετρα τοποθετήθηκαν στη θέση τους
  • 7. Υπήρχαν ασυνέπειες μεταξύ του προτύπου και του σώματος
  • 8. Πηγαίνετε στο βήμα 2 μέχρι να ταιριάζουν όλες οι τρύπες
Το πάνελ είναι κατασκευασμένο από PET χιλιοστού, καλυμμένο με τυπωμένη και πλαστικοποιημένη μεμβράνη, οι τρύπες κόπηκαν με λέιζερ χρησιμοποιώντας ένα αρχείο CDR. Από τους διαφημιστές του Ιρκούτσκ, όλα αυτά μου κόστισαν μόνο 240 ρούβλια.

Τα πλαϊνά τοιχώματα κόπηκαν από κόντρα πλακέ.

Τρέχων τύπος συσκευής:

Κόστος εξαρτημάτων:

  • Arduino UNO R3 RUR 320
  • Faders sp3-25a 5x9=45 r.
  • Στόμα. ποτενσιόμετρα + πόμολα 85 τρίψτε.
  • Κωδικοποιητής 15 rub.
  • Κουμπιά pbs-26b 16x19=304 τρίψιμο.
  • Πάνελ 240 τρίψτε.
  • Πολυπλέκτης 16 τρίψιμο.
  • Κόντρα πλακέ, textolite, διακόπτες εναλλαγής, θήκη DVD - στην περίπτωσή μου, δωρεάν.
Σύνολο: 1025 τρίψτε.

Ο ελεγκτής αντιμετωπίζει τις εργασίες που του έχουν ανατεθεί και ελέγχει τον ήχο σχεδόν σε οποιοδήποτε πρόγραμμα επεξεργασίας ήχου.

Τα σχέδια είναι να καλύψετε το κόντρα πλακέ με λεκέ και να κόψετε το κάτω κάλυμμα από πλεξιγκλάς. Προσθέστε επίσης μια θύρα επέκτασης για να συνδέσετε έναν ελεγκτή δαπέδου.

Κωδικός για το Arduino και υπογραφή στο Github.

Τα περισσότερα άρθρα στο Διαδίκτυο για την κατασκευή MIDI πληκτρολόγια, ελεγκτές, τηλεχειριστήρια κ.λπ. βασίζονται στη χρήση υποδοχών MIDI, η σύνδεση των οποίων να σύγχρονο υπολογιστήμπορεί να αποδειχθεί προβληματική. Οι παλαιότερες κάρτες ήχου είχαν μια θύρα παιχνιδιού στην οποία μπορούσατε να συνδέσετε ένα joystick ή μια συσκευή MIDI:

Ωστόσο, όλα είναι καινούργια μητρικές πλακέτεςέρχονται με ενσωματωμένο ελεγκτή ήχου και οι κάρτες ήχου συχνά δεν έχουν τη δυνατότητα σύνδεσης συσκευών MIDI.
Το μόνο που μένει είναι είτε να αγοράσετε ένα σύγχρονο πληκτρολόγιο MIDI, κονσόλα DJ κ.λπ. με έξοδο USB για σύνδεση σε υπολογιστή, ή αγορά/συγκόλληση προσαρμογέα ή αγορά ειδικού κάρτα ήχουμε δυνατότητα σύνδεσης συσκευών MIDI. Η αγορά, φυσικά, δεν είναι πρόβλημα, αλλά δεν είναι αυτός ο λόγος που ήρθαμε σε αυτόν τον ιστότοπο, σωστά;

Σε αυτό το άρθρο θέλω να δείξω πώς μπορείτε να χρησιμοποιήσετε έναν φθηνό ελεγκτή Arduino για να φτιάξετε ένα απλό πληκτρολόγιο MIDI με σύνδεση USB για 8 πλήκτρα και τροχό κύλισης.

Χρησιμοποίησα λοιπόν:
Ελεγκτής Arduino UNO
8 τεμ. κουμπιά
8 αντιστάσεις 10 kOhm
περιστροφικός κωδικοποιητής 25LB22-Q
breadboard και jumpers

Το διάγραμμα σύνδεσης έχει ως εξής:

Για σύνδεση χρησιμοποίησα τα περισσότερα απλούστερη επιλογή: 1 κλειδί - 1 είσοδος. Ωστόσο, όταν περισσότεροκλειδιά, διάφορα χειριστήρια κ.λπ. Μπορεί να μην υπάρχουν αρκετές είσοδοι, επομένως θα πρέπει να χρησιμοποιήσετε την ανάγνωση δεδομένων είτε μέσω αναλογικών εισόδων (με την προσθήκη αντιστάσεων διαφορετικών τιμών) είτε μέσω πολυπλεξίας. Ωστόσο, αν κρεμάσετε πολλά κλειδιά αναλογική είσοδος, τότε ενδέχεται να προκύψουν προβλήματα με την ανάγνωση της κατάστασης όταν πατηθούν πολλά πλήκτρα ταυτόχρονα. Επομένως, κατά τη γνώμη μου, η πολυπλεξία είναι μια πιο αποδεκτή επιλογή.

Λογισμικό Arduino

Δεν θα εξετάσω τη δομή των δεδομένων MIDI, γιατί... αυτό περιγράφεται στο άρθρο:

Ο κωδικοποιητής είναι συνδεδεμένος με τις εισόδους διακοπής υλικού Δεν θα εξετάσω την περιγραφή της εργασίας μαζί του, γιατί Το πρόγραμμα είναι απλό και προέρχεται από την επίσημη ιστοσελίδα του Arduino.

Σε αυτό το έργο, ο κωδικοποιητής χρησιμοποιείται ως τροχός κύλισης για την αλλαγή του τροχού διαμόρφωσης, αλλά μπορεί να αντιστοιχιστεί εκ νέου για άλλους σκοπούς (κάμψη βήματος κ.λπ.).

Τα δεδομένα MIDI από τον κωδικοποιητή, από το Arduino, αποστέλλονται με την ακόλουθη γραμμή:
noteOn(0xB0, 0x01, encoder0Pos);
όπου 0xB0 είναι το μήνυμα του ελεγκτή (αλλαγή ελέγχου)
0x01 - κωδικός ελεγκτή (στην περίπτωσή μας Διαμόρφωση)
encoder0Pos - τιμή ελεγκτή (στην περίπτωσή μας 0-127).
Αλλάζοντας τους κωδικούς ελεγκτών, μπορείτε να χρησιμοποιήσετε τον τροχό κύλισης (κωδικοποιητής) για μια ποικιλία ελεγκτών.

Αξίζει επίσης να αναφερθεί το Pitch Bend. Από την προδιαγραφή MIDI προκύπτει ότι είναι απαραίτητο να στείλετε ένα μήνυμα τριών byte: 0xE0 (κωδικός Pitch Bend), MSB (high byte), LSB (low byte).

Τα δύο εξωτερικά byte αποθηκεύουν μια τιμή βήματος 14-bit που μπορεί να κυμαίνεται από 0...16383 (0x3FFF). Η μέση είναι 0x2000, οτιδήποτε πάνω από αυτήν την τιμή προκαλεί την αλλαγή του τόνου προς τα πάνω, εάν είναι χαμηλότερη, το βήμα αλλάζει προς τα κάτω.
Στον κώδικα του προγράμματος, σχολίασα τις γραμμές εάν ξαφνικά θέλετε να χρησιμοποιήσετε το Pitch Bend αντί για διαμόρφωση (μέση τιμή, αποσύνθεση σε 2 byte, κ.λπ.)

Ο κωδικός ανίχνευσης πατήματος πλήκτρων περιλαμβάνει τρεις καταστάσεις: πατιέται ένα πλήκτρο, κρατιέται ένα πλήκτρο και αφήνεται ένα πλήκτρο. Αυτό έγινε για να μπορεί να μεταδοθεί η τιμή της διάρκειας ενός πλήκτρου. Εάν αυτό δεν είναι απαραίτητο, τότε μπορείτε να αφήσετε μόνο μία κατάσταση (πάτημα πλήκτρων), το πρόγραμμα σε αυτήν την περίπτωση θα απλοποιηθεί σημαντικά.
Για να χειριστείτε την κατάσταση καθενός από τα οκτώ κλειδιά, χρησιμοποιείται ο ακόλουθος κώδικας:

Εάν (buttonState_C == HIGH && note_C_send_on == false) // Πατήθηκε το πλήκτρο ( noteOn(0x90, note_C, 0x7F); note_C_send_on = true; // Note On εντολή εστάλη note_C_send_off = false; // Σημείωση Off εάν η εντολή δεν έχει σταλεί) (buttonState_C == HIGH && note_C_send_on == true) // Εάν το κλειδί είναι κρατημένο ( noteOn(0x00, note_C, 0x7F); note_C_send_on = true; note_C_send_off = false; ) αλλιώς εάν (buttonState_C_send &_OW =false) // Εάν το κλειδί απελευθερωθεί ( noteOn(0x90, note_C, 0x00); note_C_send_on = false; note_C_send_off = true; encoder0Pos = 0; // Επαναφέρετε τη θέση του τροχού στο μηδέν ....... ..... .. ... .... // Λειτουργία για αποστολή μηνυμάτων MIDI σε σειριακή θύρα void noteOn(int cmd, int pitch, int velocity) ( Serial.write(cmd); Serial.write(pitch); Serial.write(velocity); delay(20); )

Λάβετε υπόψη ότι εάν χρησιμοποιείται το pitch bend, τότε το encoder0Pos θα πρέπει να επιστραφεί όχι στο μηδέν, αλλά στο 0x2000 (ή είναι καλύτερα να ορίσετε τον ορισμό στην αρχή του προγράμματος).

Έτσι, το κύκλωμα συναρμολογείται, το σκίτσο φορτώνεται στον ελεγκτή, εκκινούμε το Serial Monitor, αλλάζουμε την ταχύτητα μετάδοσης σε 115200 και πατάμε τα πλήκτρα ή περιστρέφουμε τον κωδικοποιητή και κοιτάμε τις τιμές.
Εάν όλα είναι καλά, τότε προχωρήστε στο επόμενο μέρος. Θα πω αμέσως ότι για μένα αποδείχθηκε ότι ήταν το πιο προβληματικό και αν δεν είχα βρει έναν εικονικό μετατροπέα USB -> Midi, αυτό το άρθρο δεν θα υπήρχε.

Λογισμικό υπολογιστή (Windows)

Για να λαμβάνετε δεδομένα μέσω USB εικονικόΘύρα COM από το Arduino και μεταφορά τους σε οποιοδήποτε πρόγραμμα MIDI sequencer χρειάζεστε ειδική χρησιμότητα: Serial MIDI Converter V2D (site office)

Το πρόγραμμα είναι πολλαπλών πλατφορμών, λειτούργησε σε μένα στα Windows 7 x64, αν και με κάποια προβλήματα.

Το εκκινούμε, επιλέγουμε θύρα USB, ρυθμός baud (115200) και θύρα εισόδου MIDI και θύρα εξόδου MIDI.

Τώρα, όλα τα δεδομένα MIDI που έρχονται στην εικονική θύρα COM USB 12 ανακατευθύνονται στη θύρα MIDI Yoke 6 (χρησιμοποίησα το πρόγραμμα MIDI Yoke για να δημιουργήσω εικονικές θύρες MIDI). Μπορείτε να τα ανακατευθύνετε σε Microsoft GS Wavetable Synth και σε άλλες θύρες.
Το πρόγραμμα πρέπει να είναι πάντα ενεργοποιημένο. Όταν πατάτε πλήκτρα ή περιστρέφετε το κουμπί του κωδικοποιητή, η ένδειξη Serial RX στο κάτω μέρος πρέπει να αναβοσβήνει.

Για την οπτική εμφάνιση των εισερχόμενων δεδομένων MIDI από τη θύρα, βρήκα πολύ χρήσιμο το πρόγραμμα MIDI-OX (ιστότοπος γραφείου):

Σημειώστε ότι στις ρυθμίσεις MIDI Devices πρέπει να ορίσετε τη θύρα εισόδου MIDI.

Τώρα, όταν πατάτε τα πλήκτρα σημειώσεων ή περιστρέφετε τον τροχό, θα βλέπετε δεδομένα MIDI στο Monitor-Output.

Οτι. Με τη βοήθεια λογισμικού και υλικού, μπορέσαμε να το κάνουμε στον ελεγκτή Arduino πιο απλόΠληκτρολόγιο MIDI με μεταφορά δεδομένων σε υπολογιστή για μεταγενέστερη επεξεργασία, για παράδειγμα στο Cubase, γ. συμπεριλαμβανομένου σε πραγματικό χρόνο.
Με βάση αυτό το έργο, μπορείτε να φτιάξετε μια κονσόλα DJ, ένα πλήρες πληκτρολόγιο MIDI κ.λπ.

Παρακάτω μπορείτε να κατεβάσετε το σκίτσο INO, το Serial MIDI Converter V2D, το MIDI-OX και το MIDI Yoke

Μερικοί μουσικοί που γνωρίζουν ηλεκτρονικά ή ηλεκτρονικοί μηχανικοί που τους αρέσει να παίζουν μουσική, θα ήθελαν να συνδέσουν τη συσκευή MIDI τους στο Arduino, αλλά δεν ξέρουν πώς να το κάνουν σωστά. Αυτη η εργασιαθα σας βοηθήσει να κατανοήσετε αυτό το ζήτημα.


Αρχικά, ας καταλάβουμε λίγο τι είναι το MIDI. Το MIDI σημαίνει Ψηφιακή διεπαφή μουσικών οργάνων ή στα ρωσικά ψηφιακή διεπαφήμουσικά όργανα. Ο μεταδιδόμενος κώδικας αυτής της διεπαφής μπορεί να κρυπτογραφήσει τις παραμέτρους της έντασης, του πλήκτρου, του ρυθμού και άλλα χαρακτηριστικά των μουσικών οργάνων. Τα δεδομένα MIDI μεταδίδονται συνήθως μέσω διαύλων πέντε περασμάτων με στρογγυλές υποδοχές DIN 41524, επίσης με πέντε ακροδέκτες, όπως φαίνεται στο παρακάτω διάγραμμα. Τυπική ταχύτηταμετάδοση δεδομένων τέτοιων σειριακή διεπαφήείναι 31,25 kbit/s. Η μετάδοση είναι μονής κατεύθυνσης, δηλαδή, σε ένα σύστημα που συνδέεται με MIDI, τα μουσικά όργανα όπως τα συνθεσάιζερ μπορούν να μεταδώσουν δεδομένα μόνο σε μια κεντρική μονάδα, όπως έναν πίνακα ελέγχου ήχου surround ή έναν υπολογιστή. Να θυμάστε ότι τα δεδομένα MIDI δεν είναι ψηφιοποιημένος ήχος, αλλά εντολές και τιμές, όπως σημειώσεις, παράμετροι ήχου κ.λπ.


Απαιτούμενα εξαρτήματα

  • Υποδοχή DIN/MIDI 5 ακίδων – 1 τεμ.
  • Optocoupler 4n35 ή ισοδύναμο – 1 τεμ.
  • Δίοδος IN914 ή ισοδύναμο – 1 τεμ.
  • Αντίσταση 220 Ohm – 1 τεμ.
  • Αντίσταση 560 Ohm (πιθανό 220 και 230 στη σειρά) – 1 τεμ.
  • Πλάκα τοποθέτησης - 1 τεμ.
  • Arduino - 1 τεμ.
  • Καλώδιο MIDI - 1 τεμ.
  • Συσκευή MIDI – 1 τεμ.

Σχέδιο Συνδέσεις Arduinoσε συσκευές MIDI




Το διάγραμμα που δημιουργήθηκε με τη χρήση του fritzing δείχνει τις συνδέσεις των εξαρτημάτων με κάποια λεπτομέρεια. Όλα εδώ συνδέονται πολύ απλά και εύκολα. Στην καρδιά του κυκλώματος βλέπουμε ένα οπτικό τσιπ γαλβανική μόνωση. Αυτός ο οπτικός συζευκτήρας χρειάζεται για τη γαλβανική απομόνωση της γραμμής MIDI από Κυκλώματα Arduino. Χωρίς αυτό μπορείτε να καείτε Είσοδος Arduino. Σε αυτή την περίπτωση, λήφθηκε ένας οπτικός συζευκτήρας της σειράς 4n35, ο οποίος αποτελείται από ένα LED και ένα φωτοτρανζίστορ, ωστόσο, αντ' αυτού, οποιοσδήποτε άλλος οπτοζεύκτης έχει παρόμοια χαρακτηριστικά.


Προσέξτε όταν συνδέετε τη δίοδο, παρατηρήστε την πολικότητα. Αυτό το σχήμαδημιουργήθηκε λαμβάνοντας υπόψη τα πρότυπα και τα χαρακτηριστικά της διεπαφής MIDI. Το αρχικό διάγραμμα κυκλώματος βρίσκεται εδώ http://www.midi.org/techspecs/electrispec.php


Κωδικός (σκίτσο για Arduino)


Αυτό είναι ένα απλό σενάριο αλληλεπίδρασης MIDI που χρησιμοποιεί τη βιβλιοθήκη MIDI.h (σενάριο MIDI CALLBACK). Ελέγχει αν έχει φτάσει το σήμα NoteOn (σημείωση) και μετακινείται στην κατάλληλη περιοχή επεξεργασίας. Μπορείτε να επικολλήσετε τον κωδικό σας σε αυτήν την περιοχή.


#περιλαμβάνω MIDI_CREATE_DEFAULT_INSTANCE(); void handleNoteOn (κανάλι byte, βήμα byte, ταχύτητα byte) ( // θέση για τον κώδικά σας όταν λαμβάνεται σήμα) void handleNoteOff (κανάλι byte, βήμα byte, ταχύτητα byte) ( // θέση για τον κώδικά σας όταν δεν υπάρχει σήμα) void setup() ( MIDI.setHandleNoteOn(handleNoteOn); MIDI.setHandleNoteOff(handleNoteOff); MIDI.begin(MIDI_CHANNEL_OMNI); ) void loop() ( MIDI.read; )