Forum: Mikrocontroller und Digitale Elektronik Midi Stepsequencer controller


von Tim T. (tim_t)


Lesenswert?

Hallo ihr lieben..
Vllt kennen einige von euch den Stepsequencer FLstudio 
(http://www.image-line.com/documents/flstudio.html). Ich habe dort 
bereits einige Projekte gestartet, jedoch merkt jeder der sich damit 
beschäftigt das man die vielzahl der Effekte (besonders beim live 
mischen) nicht (in entsprechender Zeit) automatisieren kann . Daher 
wollte ich mir einen Midi-Controller bauen.

Ich habe mir einen Midi2Usb adapter gekauft, welcher von FLstudio auch 
erkannt wird. Ausserdem habe ich dieses Projekt nachgebaut: 
http://www.wiesolator.de/index.php?area=Musik&topic=MIDI-Einstieg&stopic=MIDI%20und%20AVR 
.
Ich habe das ganze jedoch um ein LCD(4x20) erweitert um Sichtbar zu 
machen ob der Atmega alles richtig macht. mein Quelltext sieht so aus:
1
                        $regfile = "m8def.dat"
2
$crystal = 1000000                                          ' 1 MHz
3
$baud = 31250                                               ' MIDI-Baudrate (31,25kBit)
4
5
6
Taster Alias Pind.2
7
Dim Keydown As Byte                                         ' Tasten-Merker
8
Config Lcd = 20 * 4
9
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
10
Dim I As Byte , J As Byte , X As Byte
11
Config Portc.6 = Input                                      'launch btn
12
Config Portb.3 = Input                                      'rld btn
13
Config Portb.1 = Output
14
Config Portb.2 = Output
15
16
17
Deflcdchar 0 , 32 , 32 , 2 , 17 , 17 , 17 , 14 , 32         ' replace [x] with number (0-7)
18
19
Deflcdchar 1 , 32 , 32 , 12 , 16 , 17 , 17 , 14 , 32        ' replace [x] with number (0-7)
20
21
Deflcdchar 2 , 32 , 32 , 14 , 17 , 16 , 16 , 14 , 32        ' replace [x] with number (0-7)
22
23
Deflcdchar 3 , 32 , 32 , 14 , 17 , 17 , 17 , 8 , 32         ' replace [x] with number (0-7)
24
25
Deflcdchar 4 , 32 , 32 , 14 , 17 , 17 , 1 , 6 , 32          ' replace [x] with number (0-7)
26
27
Deflcdchar 5 , 32 , 32 , 14 , 1 , 1 , 17 , 14 , 32          ' replace [x] with number (0-7)
28
29
Init:
30
   Ddrd.1 = 1                                               ' Sendeleitung auf Output
31
   Portd.2 = 1                                              ' internen Pull-Up aktivieren für Taster
32
 '  Portc.5 = 1
33
 '  Portc.4 = 1
34
   Portb.2 = 0
35
   Portb.1 = 0
36
Goto Start_routine
37
38
Start_routine:                                           'Welcome-screen
39
Cls
40
I = 0
41
42
Locate 1 , 1
43
Lcd "Welcome :)"
44
Do
45
Locate 2 , 1
46
Lcd Chr(0)
47
Waitms 25
48
Locate 2 , 1
49
Lcd Chr(1)
50
Waitms 25
51
Locate 2 , 1
52
Lcd Chr(2)
53
Waitms 25
54
Locate 2 , 1
55
Lcd Chr(3)
56
Waitms 25
57
Locate 2 , 1
58
Lcd Chr(4)
59
Waitms 25
60
Locate 2 , 1
61
Lcd Chr(5)
62
Waitms 25
63
Incr I
64
Loop Until I = 7
65
66
67
68
69
70
'Do
71
'   Debounce Pinc.5 , 1 , On_taster1 , Sub
72
'   Debounce Pinc.4 , 1 , Start_routine , Sub
73
'Loop
74
75
Main:
76
  Do
77
    If Taster = 0 Then
78
      If Keydown = 1 Then
79
        Gosub Sendmidinoteon
80
        Keydown = 0
81
      End If
82
    Else
83
      If Keydown = 0 Then
84
        Gosub Sendmidinoteoff
85
        Keydown = 1
86
      End If
87
    End If
88
    Waitms 20
89
  Loop
90
  End
91
92
  Sendmidinoteon:
93
  Print Chr(&B01000000);                                    ' NOTE-ON-Command
94
  Print Chr(69);                                            ' Tasten-Nummer 69 (A4)
95
  Print Chr(100);                                           ' Key-Down-Velocity 100
96
  Lcd "note an"
97
  Waitms 50
98
  Cls
99
Return
100
101
Sendmidinoteoff:
102
  Print Chr(&B10000000);                                    ' NOTE-OFF-Command
103
  Print Chr(69);                                            ' Tasten-Nummer 69 (A4)
104
  Print Chr(0);                                             ' Release-Velocity 0 (Default)
105
  Lcd "note aus"
106
  Waitms 50
107
  Cls
108
Return
109
110
111
112
113
On_taster1:
114
115
116
   Return


An dem Midi2Usb adapter sind Led's welche anzeigen ob Daten empfangen 
wurden,
Welche auch leuchten wenn ich den switch betätige. FLstudio jedoch 
erkennt Keinen Tastendruck.
Treiber für den Adapter hat Windows 7 automatisch installiert und 
Flstudio erkennt den Adapter auch als Midi-device..



Und jetzt meine Frage : Muss ich jetzt Software(FL)- oder 
Hardwaretechnisch etwas verändern und was ? :)

lG
Tim T.

von Karl (Gast)


Lesenswert?

Stimmen die 1 MHz in $crystal?

Funktioniert es ohne das LCD? (Befehle auskommentieren)

von Tim T. (tim_t)


Lesenswert?

Karl schrieb:
> Stimmen die 1 MHz in $crystal?

Ja steht zumindestens so in dem "Tutorial" :)
ausserdem hat diese "traffic-led" mit 4mhz nicht geleuchtet, mit dem 
1Mhz jedoch schon...


Karl schrieb:
> Funktioniert es ohne das LCD? (Befehle auskommentieren)

irgendwelche Daten werden ja ausgegeben, wahrscheinlich auch Midi daten, 
da ja diese Empfangs LED am adapter leuchtet wenn ich den Note_on bzw 
Note_off Befehl sende...

Weiss denn jemand wie das in FLStudio verdrahtet ist welche 
Inpu-Midi-Befehle man auf die Controls verlinken kann ?

korregiert mich ruhig wenn ich falsch liege :D

Tim T.

von Rene B. (themason) Benutzerseite


Lesenswert?

@Tim

Wenn der Adapter ein ganz normaler MIDI Adapter ist (also als MIDI-Gerät 
erkannt wird) dann kannst du ja mit einem ganz einfachen MIDI-Monitor 
gucken obs richtig ankommt. Dann müsstest du nur noch im FLstudio wegen 
dem Routing suchen. Da dürfte es ja Freeware-MIDI-Monitore geben die 
auch unter Win 7 laufen.

Sind denn die Fuses richtig gesetzt ? Dann müsste $crytsal nur auf den 
verbauten Quarz richtig eingestellt werden. Der Rest ist dann Bascom.

von Karl (Gast)


Lesenswert?

Tim T. schrieb:
> Ja steht zumindestens so in dem "Tutorial" :)

Kontrolle ist besser. Einfach die Fuses überprüfen und ggf. richtig 
setzen. Der Tip von Rene mit dem Monitor ist gut.

Normalerweise verwendet man für eine verlässliche serielle Kommunikation 
eine externe Taktquelle (externer Quarz z.B.). Frage mich, warum das bei 
MIDI nicht so sein soll????

von Rene B. (themason) Benutzerseite


Lesenswert?

Also MIDI ohne Quarz wird nix. Gilt für alle Übertragungen per UART mit 
definierter Baudrate. Bei MIDI reicht ein "gerader" Quarz, da 31250 
recht leicht daraus gebildet werden kann. Daher würd ich einfach mal die 
Fuses checken. Mit dem Monitor ist immer ne gute Quelle da auch u.u. 
Fehler angezeigt werden, vorausgesetzt das Monitor-Programm findet das 
Interface bzw der Treiber des Interfaces ist wirklich als normales MIDI 
Gerät im Gerätemanager (unter XP) aufzufinden. Wenn dann nix hilft 
sollte man den Fehler spätestens mit einem Scope finden können. MIDI-Out 
ist recht unspektakulär und einfach.

von Tim T. (tim_t)


Lesenswert?

Hm Okei danke für die Info's...
Hab noch nie was mit externem Quarz gemacht vllt könnte mal jmd ein 
Bildchen für mich zeichen oder so ? :D
Aber generrell wieso benötigt man ein externes wieso tuts das interne 
nicht ? ISt das zu ungenau?
Ich werde das morgen mal mit dem Monitor testen... ist es denn wichtig 
wielang die kabel sind ? habe nämlich ca 20cm unabgeschirmte litze da 
... vielleicht gibts da einfach zu viele störsignale.


Karl schrieb:
> Einfach die Fuses überprüfen und ggf. richtig
> setzen.

Wie mache ich das und wie soll ich die setzen ? habe bisher nur mit 
Standard-konfiguration gearbeitet :)

Danke auf jedenfall schonmal für die Tips :)

Tim T.

von Maik M. (myco)


Lesenswert?

Das höchste Bit im Midi-Status-Byte muss immer high(1) sein, von daher 
kann
Print Chr(&B01000000);                                    ' 
NOTE-ON-Command

nicht stimmen. Im Midi-Protokoll wäre das irgendein Datenbyte, was zu 
einer vorherigen Nachricht gehört. Wird wohl von allen Empfängern 
ignoriert, weil Midi-Nachrichten definierte Längen haben oder von 
Start-Stop Statusbytes umgeben sind (SysEx).

In Fruity musst du in den Midi-Settings dein Midi-Input wählen und 
"enable" markieren, in der Liste der Inputs wird es dann als "active" 
dargestellt. Wenn du dann etwas spielen willst, musst du vorher ein 
Instrument öffnen, oder dessen "Channel" markiert haben oder dessen 
Pianoroll im Vordergrund haben.

Du kannst fast jeden Knopf, Button, Regler usw. den du in Fruity siehst 
per Midi-Steuern. Allerdings geht das nicht per Default, außer du baust 
einen bereits existierenden Midi-Controller nach (für den es schon ein 
Setup gibt). Ansonsten Rechtsklick auf den Knopf "Link to Controller..." 
dann einen Knopf an deinem Controller bewegen. FL-Studio erkennt den in 
der Regel sofort.

von Karl (Gast)


Lesenswert?

Tim T. schrieb:
> Wie mache ich das und wie soll ich die setzen ? habe bisher nur mit
> Standard-konfiguration gearbeitet :)

In BASCOM hier (Lock and Fuse Bits):

http://avrhelp.mcselec.com/index.html?program_send_to_chip.htm

Hier kannst Du die Fuse Bits lesen und schreiben. In Deinem Fall wären 
wichtig das Fusebit C und Fusebit KLA987.

Die in der Hilfe gezeigte Konfiguration würde 8 MHz ergeben.

Wenn Du einen externen Quarz benutzt, musst Du ggf. das Fusebit C und in 
jedem Fall das Fusebit KLA987 ändern.

Nachfolgend ein kleiner Einführungskurs bezgl. Fusebits (leider nicht 
direkt auf BASCOM bezogen, aber die Optionen sind die gleichen).

http://halvar.at/elektronik/kleiner_bascom_avr_kurs/fuse_lock_bits_1/

Und immer überlegt handeln! Man kann durch falsch gesetzte Fusebits 
einen AVR "töten". Vielleicht etwas drastisch formuliert, aber man kann 
nur mit viel Aufwand so einen "verfusten" Mikrocontroller wieder neu 
programmieren.

von Tim T. (tim_t)


Lesenswert?

Hallo :)
Also ich hab grade mal mit dem Monitor MIDIOX geguckt ob da was 
ankommt..
Der adapter wird als "USB Midi Interface" erkannt, liefert jedoch keine 
Daten.
Wie gesagt ich habe noch nie ein externes quarz verbaut, daher könnte 
ich da ein wenig hilfe brauchen (welche pins und Konfiguration in den 
Fuses)...

Maik M. schrieb:
> Das höchste Bit im Midi-Status-Byte muss immer high(1) sein, von daher
> kann
> Print Chr(&B01000000);                                    '
> NOTE-ON-Command
>
> nicht stimmen

Wie muss das denn aussehen ? Ich versteh das irgendwie nicht. Hab mir 
eine Tabelle mit Midi Commands rausgesucht, weiss aber nichtmal welchen 
ich nehmen muss (Controlchange oder Note_on ?!) da ich nicht weiß welche 
FLstudio routen kann...

von Rene B. (themason) Benutzerseite


Lesenswert?

@Tim

Ohne externen Quarz wird das definitiv nix !!
Es kann sein das du sporadisch was empfängst aber wenns wärmer oder 
kälter wird kann das ganze aussetzen. Der interne Oszillator ist ein 
RC-Glied dessen Frequenz von der Temperatur abhängig ist. Ein Quarz hat 
eine definierte Frequenz die weitgehend temperaturstabil ist und nur um 
wenige ppm abweicht. Egal ob du per RS232, MIDI oder sonst was über den 
UART was rausschickst : Der Takt muß (!!) mit einem Quarz oder externem 
Taktgenerator erzeugt werden.

Ein Quarz am AVR ist total simpel. Einfach den Quarz mit seinen beiden 
beinchen an XTAL 1 und XTAL 2 anschließen, und beide Beinchen noch über 
jeweils einen 15-33pF Keramikkondensator gegen Masse schalten (und das 
ganze 3-er-Gespann möglichst nah am AVR), die Fuses umstellen : läuft.

Die MIDI Befehle Note On/Off Program Change, Modulation (bzw Controller 
Change) haben immer das höchste Bit gesetzt. Also alle Bytes von 00-7f 
sind Nutzdaten. Alle Bytes von 80-FF sind Befehle.
Schick einfach mal 91 40 30 (Hexadezimal) raus und es müsste was 
ankommen.
91 ist in dem Falle der Befehl Note On für Kanal 2 (!). 40 ist die Taste 
und 30 die Velocity.

von Tim T. (tim_t)


Lesenswert?

@ Rene B.
danke für den tipp und die erklärung :) was für ein quarz muss das sein 
1mhz oder ? :D sry bin da echt noch ein ziemlicher n00b :(

Und was GENAU muss ich an den Fuses umstellen ? wie gesagt hab in meinem 
Leben noch kein Fusebit umgestellt :D

und die 91 40 30 muss ich für Bacom noch in Binär umwandeln oder kann 
bascom direkt hexa ?

lg
Tim T.

von Rene B. (themason) Benutzerseite


Lesenswert?

@Tim

Der Quarz für MIDI kann ein 1/2/4/8/16/10/20 MHz Quarz sein.
Die 31250 lassen sich am besten durch einen "geraden" Quarz (also 
"ganze" Megahertz) bilden. Den Prescaler bzw die Baudrate musst du 
ausrechnen und schauen wie du Bascom das beigebracht bekommst (kenne 
Bascom nicht, mach das alles in C).
Bei den Fuses weiß ich ja nicht mit welchem Tool du das machst. Keine 
Ahnung ob Bascom da was zur Verfügung stellt oder nicht. Das müsstest du 
dir durchlesen.
Bei den 91 40 30 von Hex in Binär umwandeln weiß ich nicht ob Bascom das 
kann (denke aber schon). Notalls versuche es mit 145 64 48 (dezimal).

Also alles in allem würd ich sagen : Les dir nochmal was zu Bascom 
durch.
Ich denke da dürfte einige deiner Fragen beantworten. Zumal denke ich in 
Bascom schon einige was mit MIDI gemacht haben.

von Karl (Gast)


Lesenswert?

Rene B. schrieb:
> Das müsstest du
> dir durchlesen.

Jepp, die Links habe ich weiter oben schon angegeben.

von Midi Man (Gast)


Lesenswert?

Hättest Du da Source Code zu?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.