 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
| Poglej prejšnjo temo :: Poglej naslednjo temo |
| Avtor |
Sporočilo |
Milek Član


Pridružen-a: Ned 02 Avg 2015 13:50 Prispevkov: 117 Aktiv.: 0.90 Kraj: Maribor
|
Objavljeno: Tor Sep 16, 2025 6:16 pm Naslov sporočila: MIDI tipka, MIDI tester |
|
|
Jesenski projekt: Izdelava MIDI MISW-01 tipke/testerja.
MIDI tipka:
Včasih pri DAW-u potrebujemo tipko, ki jo bomo uporabili za določene funkcije. Ker ima večina naprav MIDI vhod/izhod je enostavna rešitev z MIDI tipko.
Sami bomo za to aplikacijo sprogramirali uC, zadošca 8 bitni atmega328 in arduino IDE. Ker bomo tipko uporabljali/vklapljali s stopalom je dobro, da je v kovinskem ohišju.
-programiramo Arduino (sam sem uporabil nano verzijo), naloženo moramo imeti MIDI.h knjižnico
in program:
| Koda: |
#include <MIDI.h>
// Spremenljivke gumba
int buttonVal = 0; // vrednost, prebrana iz gumba
int buttonPlay = 3; // pin D3 Predvajaj
int ledPin = 13; // ledika
// Ustvari in poveže MIDI vmesnik s privzetim serijskim vrati strojne opreme
MIDI_CREATE_DEFAULT_INSTANCE();
// spremenljivka nastavitev
int D1count = 0;
void setup()
{
MIDI.begin(MIDI_CHANNEL_OMNI); // Poslušaj vsa dohodna sporočila
// nastavitev tipke
pinMode(buttonPlay, INPUT);
digitalWrite(buttonPlay, HIGH);
// inicializiraj LED pin kot izhod:
pinMode(ledPin, OUTPUT);
}
void loop()
{
// Preberi stanje gumba
buttonVal = digitalRead(buttonPlay);
// preveri, ali je gumb pritisnjen. Če je, je buttonState na LOW:
if(buttonVal == LOW)
{
D1count++; // povečaj 'count' za 1
if(D1count > 1)
D1count = 0;
delay(200); // čakaj 200 milisekund
}
if (D1count == 0 && buttonVal == LOW) {
// prvi ukaz
play();
}
if (D1count == 1 && buttonVal == LOW){
// drugi ukaz
playdrugi();
}
// preverimo prihajajoče sporočilo
//MIDI.read();
}
void play()
{
// Pošlji CC 27 z vrednostjo 0 na kanalu 2
MIDI.sendControlChange(27, 0, 2);
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
delay(500);
//MIDI.sendControlChange(27, 0, 2);
}
void playdrugi()
{
// Pošlji CC 27 z vrednostjo 127 na kanal 2
MIDI.sendControlChange(27, 127, 2);
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
delay(500);
//MIDI.sendControlChange(27, 0, 2);
}
|
Sestavljanje:
-preizkusimo ga s programom MIDI-OX http://www.midiox.com/
-če vse deluje ok, sledi vgradnja v ohišje
-lahko si izdelamo tudi vezje na tiv plošcico
-uporabimo masivno tipko, zaradi robustnosti mora zdržati večje pritiske
-za tipko lahko izdelamo tudi uporo, da se ob uporabi ne zlomi
-ko smo vse sestavili, še zalijemo z vročim lepilom
-uporabimo lahko 9V/300mA adpater, ali kakšen podoben, vezje ni velik potrošnik
Sam sem uporabil komando CC27 (hex) vrednost 127 na drugem kanalu (glasnost/mute na digitalni mešalni mizi):
MIDI.sendControlChange(27, 127, 2)
MIDI.sendControlChange(27, 0, 2) mute
MIDI komando lahko spremenite glede na vaše zahteve, ena tipka ima lahko tudi dve funkciji, daljši pritisk pritisk tipke je lahko druga komanda. Sam sem uporabil samo vklop in izklop.
Vezje lahko vgradite tudi v drugo ohišje, kaj vam leži doma.
MIDI-tester:
Če bomo izdelali vezje kot MIDI tester, je lahko navadna tipka/taster brez ohišja, potrebujete samo 5V na pin 5V ali adapter, ki ga vežete na RAW pin Anano.
in program:
| Koda: |
#include <MIDI.h>
// Spremenljivke gumba
int buttonVal = 0; // vrednost, prebrana iz gumba
int buttonPlay = 3; // pin D3 Predvajaj
int ledPin = 13; // ledika
// Ustvari in poveže MIDI vmesnik s privzetim serijskim vrati strojne opreme
MIDI_CREATE_DEFAULT_INSTANCE();
void setup()
{
MIDI.begin(MIDI_CHANNEL_OMNI); // Poslušaj vsa dohodna sporočila
// nastavitev tipke
pinMode(buttonPlay, INPUT);
digitalWrite(buttonPlay,HIGH);
// inicializiraj LED pin kot izhod:
pinMode(ledPin, OUTPUT);
}
void loop()
{
// Preberi stanje gumba
buttonVal = digitalRead(buttonPlay);
// preveri, ali je gumb pritisnjen. Če je, je buttonState nastavljen na HIGH:
if (buttonVal == LOW) {
// predvajaj in vklopi LED:
play();
digitalWrite(ledPin, HIGH);
} else {
// izklopi LED:
digitalWrite(ledPin, LOW);
}
// Preberi dohodna sporočila
//MIDI.read();
}
void play()
{
// Pošlji 24 not z vrednostjo 127 na kanalu 1
MIDI.sendNoteOn(60, 127, 1);
MIDI.sendNoteOn(62, 127, 1);
MIDI.sendNoteOn(64, 127, 1);
MIDI.sendNoteOn(66, 127, 1);
MIDI.sendNoteOn(68, 127, 1);
MIDI.sendNoteOn(70, 127, 1);
MIDI.sendNoteOn(72, 127, 1);
MIDI.sendNoteOn(74, 127, 1);
MIDI.sendNoteOn(76, 127, 1);
MIDI.sendNoteOn(78, 127, 1);
MIDI.sendNoteOn(80, 127, 1);
MIDI.sendNoteOn(82, 127, 1);
MIDI.sendNoteOn(84, 127, 1);
MIDI.sendNoteOn(86, 127, 1);
MIDI.sendNoteOn(88, 127, 1);
MIDI.sendNoteOn(90, 127, 1);
MIDI.sendNoteOn(92, 127, 1);
MIDI.sendNoteOn(94, 127, 1);
MIDI.sendNoteOn(96, 127, 1);
MIDI.sendNoteOn(98, 127, 1);
MIDI.sendNoteOn(100, 127, 1);
MIDI.sendNoteOn(102, 127, 1);
MIDI.sendNoteOn(104, 127, 1);
MIDI.sendNoteOn(106, 127, 1);
delay (1000);
// Pošlji 24 not z vrednostjo 0/izklop na kanalu 1
MIDI.sendNoteOn(60, 0, 1);
MIDI.sendNoteOn(62, 0, 1);
MIDI.sendNoteOn(64, 0, 1);
MIDI.sendNoteOn(66, 0, 1);
MIDI.sendNoteOn(68, 0, 1);
MIDI.sendNoteOn(70, 0, 1);
MIDI.sendNoteOn(72, 0, 1);
MIDI.sendNoteOn(74, 0, 1);
MIDI.sendNoteOn(76, 0, 1);
MIDI.sendNoteOn(78, 0, 1);
MIDI.sendNoteOn(80, 0, 1);
MIDI.sendNoteOn(82, 0, 1);
MIDI.sendNoteOn(84, 0, 1);
MIDI.sendNoteOn(86, 0, 1);
MIDI.sendNoteOn(88, 0, 1);
MIDI.sendNoteOn(90, 0, 1);
MIDI.sendNoteOn(92, 0, 1);
MIDI.sendNoteOn(94, 0, 1);
MIDI.sendNoteOn(96, 0, 1);
MIDI.sendNoteOn(98, 0, 1);
MIDI.sendNoteOn(100, 0, 1);
MIDI.sendNoteOn(102, 0, 1);
MIDI.sendNoteOn(104, 0, 1);
MIDI.sendNoteOn(106, 0, 1);
}
|
--programiramo Arduino (sam sem uporabil nano verzijo), naloženo moramo imeti MIDI.h knjižnico
Test se začne ob pritisku tipke. Uporabljenih je 24 tonov, ki si sledijo MIDI.sendNoteOn(60, 127, 1), na prvem kanalu, tako lahko testiramo tudi polifonijo.
Sestavljanje:
-preizkusimo ga s programom MIDI-OX http://www.midiox.com/
- vezje lahko izdelamo kar na razvojni ploščici, glej fotko.
še seznam MIDI kontrolerjev:
kontrolerji
| Opis: |
|
| Velikost datoteke: |
16.38 KB |
| Pogledana: |
8 krat |

|
| Opis: |
|
| Velikost datoteke: |
92.44 KB |
| Pogledana: |
1 krat |

|
| Opis: |
|
| Velikost datoteke: |
65.39 KB |
| Pogledana: |
1 krat |

|
| Opis: |
|
| Velikost datoteke: |
103.71 KB |
| Pogledana: |
0 krat |

|
| Opis: |
|
| Velikost datoteke: |
101.29 KB |
| Pogledana: |
0 krat |

|
|
|
| Nazaj na vrh |
|
 |
mucek Član


 
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5625 Aktiv.: 23.44 Kraj: Domzale
|
Objavljeno: Tor Sep 16, 2025 7:33 pm Naslov sporočila: |
|
|
MIDI bi moral po standardu biti galvansko locen (sprejemni del), tako da tam manjka optocoupler.
Je pa interesantno, da se tako star protokol se vedno uporablja! Kup vmesnikov je vmes ze nastalo in spet slo v pozabo, MIDI pa kar vztraja!
V bistvu gre za klasicni UART na malo bolj nenavadnem bps (31500, ce se prav spomnim), ki je na sprejemni strani galvansko locen z darlington optocouplerjem.
Lp, G
_________________ ...lahko pa se tudi motim ... |
|
| Nazaj na vrh |
|
 |
Milek Član


Pridružen-a: Ned 02 Avg 2015 13:50 Prispevkov: 117 Aktiv.: 0.90 Kraj: Maribor
|
Objavljeno: Sob Okt 04, 2025 1:23 pm Naslov sporočila: |
|
|
Hi,
ja, res je, če uporabimo vhod je ločen z optokoplerjem. Tukaj to ni potrebno, ker uporabljamo samo izhod.
MIDI baud rate je 31250 b/s, 8 bitni, še vedno se uporablja, zanimivo. Veliko debat je bilo za MIDI 2.0 sistem v preteklih letih, ampak mislim, da ni nadgrajen ampak svoj standard. Več tukaj.
Lp.
M.G.
|
|
| Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 232 dni
Powered by phpBB © 2001, 2005 phpBB Group
|