Control Change MIDI Bascom Pomocy!

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
ramisto
-
Posty: 9
Rejestracja: 23 lip 2011, 17:19
Lokalizacja: ustka

Control Change MIDI Bascom Pomocy!

Post autor: ramisto » 24 lip 2011, 14:41

Witam, zabawę z bascomem i midi zacząłem nie dawno. Chcę zbudować kontroler midi który miałby 16 przycisków z komunikatami kontrol change od 102 do 118. Ja nie mam pomysłów jak to wykonać bo w symulacji gdy nacisne przycisk od np. control change 102 to przez UART wysyłane jest polecenie ileś razy na sekundę. Prosiłbym o wzór programu dla jednego przycisku. Z góry dziękuję i proszę o szybką odp. bo niestety artykuł z edw mi nie pomógł.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 24 lip 2011, 14:53

Może napisz jaki procesor używasz. Kiedyś w Elektronice Praktycznej był taki projekt, program był na 8051 i zajmował chyba 2KB, wiec pewnie na ATTiny2313 się to da zrobić.
Co do powtarzania się wysyłania komendy po naciśnięciu przycisku, musisz zrobić to tak ze jak naciśniesz przycisk, wysyłasz 1 komendę, i musisz czekać na jego puszczenie.

ramisto
-
Posty: 9
Rejestracja: 23 lip 2011, 17:19
Lokalizacja: ustka

Post autor: ramisto » 24 lip 2011, 18:30

Właśnie z nieba mi spadasz :wink: chce wykorzystać attiny2313 i dobrze określiłeś problem.
Nie mam pojęcia jak zrobić by wysłał jedną komendę i czekał na puszczenie przycisku. A dało by się zrobić coś w rodzaju polifonii? Mam zamiar zrobić klawiaturke 4x4 i właśnie z niej wysyłać komendy control change i wiem że żeby ona sama była polifoniczna wstawia się do przycisku szeregowo diodkę (tak czytałem). Jbc to polifonia opcjonalnie nie musi być ale by dobrze działało.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 24 lip 2011, 19:17

Projekt był publikowany w EP 3/96 w dziele Projekty Czytelników pod nazwą "Klawiatura muzyczna do komputerów osobistych"
W urządzeniu była 48 (4 oktawy) przyciskowa klawiatura + 2 przyciski do sterowania. Na upartego urządzenie można skopiwać na AT89C2051.
Tylko RS232 nadawał tam na 31250b/sek ? No chyba że standard MIDI takiego wymaga ?

ramisto
-
Posty: 9
Rejestracja: 23 lip 2011, 17:19
Lokalizacja: ustka

Post autor: ramisto » 24 lip 2011, 19:42

1. Mi się wydaje że taki jest ten standard. Czyli z tego zo napisałeś był to kontroler 48 klawiszy z komendami: note on, note off, czyli podmieniając je na control change można by używać do (w tym przypadku) sterowania abletonem?

2. Niby artykuł ok ale ten czytelnik napisał go bodajże w asemblerze a ja bym potrzebował znać funkcje, sposoby na problem wysłania jednego komunikatu i czekania do poki nie puszcze przycisku w BASCOMIE.

keruseykaryu

Post autor: keruseykaryu » 25 lip 2011, 5:48

ramisto pisze:Nie mam pojęcia jak zrobić by wysłał jedną komendę i czekał na puszczenie przycisku.
ramisto pisze:Mam zamiar zrobić klawiaturke 4x4
Skanowanie klawiatury i porównywanie jej z poprzednim stanem - zapamiętanym w zmiennej, tablicy czy jak wolisz. Jak stan taki sam to mijasz polecenia wysyłania komunikatów midi.
Polifonia? Nieznaczna modyfikacja. Przy porównaniu z poprzednim stanem, jak stan się nie zgadza to sprawdzasz co się stało z klawiszem (puścił, nacisnął) i wtedy decyzja jaki komunikat midi wysłać.

No niestety proste metody typu While pin=cośtam : Wend albo Bitwait port, który; się nie sprawdzą. Klawiatura musi być skanowana cały czas.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 25 lip 2011, 10:40

A nie wystarczyła by ci taka klawiatura.
Obrazek
12 przycisków, gotowa, cena ok 20zl. Do tego dołorzyć wyświetlacz, choćby na 2 cyfry LED.

ramisto
-
Posty: 9
Rejestracja: 23 lip 2011, 17:19
Lokalizacja: ustka

Post autor: ramisto » 25 lip 2011, 12:17

Sama klawiaturkę zrobię spokojnie. Tylko mam problem właśnie z tym wysyłaniem jednego komunikatu. Jaka funkcja odpowiada za skanowanie klawiatury i sprawdzanie czy stan sie zmienił? To jest jedyna rzecz w tym projekcie co nie daje mi spokoju :cry:

keruseykaryu

Post autor: keruseykaryu » 25 lip 2011, 17:02

ramisto pisze:Jaka funkcja odpowiada za skanowanie klawiatury
Help Twoim przyjacielem.
ramisto pisze:sprawdzanie czy stan sie zmienił
To już musisz zaprogramować sam.

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 25 lip 2011, 17:10

Można by użyć Pin change Interrupt.
tylko nie wiem jak to bedzie grać z klawiaturą matrycową

ramisto
-
Posty: 9
Rejestracja: 23 lip 2011, 17:19
Lokalizacja: ustka

Post autor: ramisto » 25 lip 2011, 20:02

Dobra jedyne co musze wywalczyć to sprawdzanie zmiany stanu :smile: I tak musiałem nieco okroić projekt bo jak zobaczylem płytkę pcb w programie to się załamałem :mrgreen:

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 25 lip 2011, 20:58

Kod: Zaznacz cały

'---------------------------------------------------------------------------
'                       (c) 1995-2005, MCS Electronics
'                             PCINT_CHANGE.BAS
' This sample shows how to use the PC interrupts
'---------------------------------------------------------------------------

$regfile = "m88def.dat"
$crystal = 8000000
$baud = 19200

Print "{027}[2J";                                           ' when you have a terminal emulator, this will clear the screen
Print "Test M88 ints"                                       ' init message

'The M88 and M168 can detect a level change on all port pins.
'We will just check on portB, pins 0-3

Config Portb = Input
Portb = &HF                                                 'activate pull up

Enable Interrupts                                           'enable global ints
Enable Pcint0                                               'we enable pcint0 as this has pcint0-pcint7
On Pcint0 Isr_pcint0                                        'we jump to this label when one of the pins is changed
Pcmsk0 = &B00001111                                         'enable pcint0-pcint3  (portb.0-portb.3)
'With pcmsk you individual select which pins must react on a logic level
'When you write a 1, the change in logic level will be detected.

Do
  nop
  'you can do anything here
  'But we show how to use the pin level change in manual mode without interrupts
  'Say we want to detect logic level change of pin 23, (PINC.0) / INT8
  Config Pinc.0 = Input                                     'you can also detect output changes but we use input
  Pcmsk1 = &B00000001                                       ' enable the bit of PCINT8 which is in PCMSK1
  If Pcifr.pcif1 = 1 Then                                   ' change detected
      Print "pinc.0 has changed"                            'in this case it must be pinc.0
      Pcifr.pcif1 = 1                                       ' write a 1 to clear the flag so we can detect it again
  End If
Loop


Isr_pcint0:
  Print "Pin change " ; Bin(pcmsk0) ; Spc(3) ; Bin(pinb)
  'As you see the mask does not change, so to find out which pin changed,
  'you need to read the PINB register.
Return

End

ramisto
-
Posty: 9
Rejestracja: 23 lip 2011, 17:19
Lokalizacja: ustka

Post autor: ramisto » 25 lip 2011, 22:34

Dzięki coś z tego wymyśle tym czasem zastanowie się nad hardwarem :wink:
Temat można zamknąć.

ODPOWIEDZ