Arduino Projekten

Tue 20-Aug-19
01:33:52




Midi Out

Datum: Thu 31 July 2014
Samenvatting: Midi Out testen van de Midi Module


Om de Midi Out van de Midi module te testen is er eerst het Midi-Thru gedeelte getest. De Jumper is goedgezet (op Thru), er is een keyboard op de Midi-In aangesloten en een Midi-apparaat op de Midi-Out (bij mij is dat een bass-synthesizer, de TB-3 (van Roland) - maar elke synthesizer met Midi-In zal werken).

De Jumper teruggezet (op Out) en er is een eenvoudig aansturingsprogramma gemaakt die het Midi apparaat aan zal sturen.

Begonnen is met een eenvoudig Note-On/ Note-Off routine voor 1 noot. Later werd dit een rijtje op-één volgende noten (Muziek-ladders met halve noten erbij).

Daarna is het programma uitgebreid geweest met een PitchBend routine, die zelf een lus vormde IN de loop-funktie (leuk om zelf eens te programmeren). En dit is er weer uitgehaald.

De Program-Change is erin geweest (en er ook weer uitgehaald).

Na nog wat speelse uitbreidingen is dit programma uiteindelijk een eenvoudig speeldoosje geworden zonder nootlengte variaties (met een kort deuntje van "Row row row the boat") en een automatische control-regelaar verandering.

Natuurlijk worden er diverse Led's aangestuurd om variabelen in het programma mee te bekijken.

  1. De 8 Led's met de decoder (74hct138). Zij geven hier aan welk Midi Commando er wordt verstuurd en worden aangestuurd vanuit de diverse Midi Functies.

  2. De 16 led's op de voorkant van het experimenteer-huis (met die 2 schuifregisters 74hc595). De Leds $F..$8 geven (binair) het Midi-Noot nummer aan. De Leds $7..$0 geven aan welke waarde er naar de opgegeven Controler (de variabele "Ctrl" bovenin het programma, hier nummer 16) wordt gestuurd.
Bovenin het programma zijn enkele interessante variabelen:
  • Channel: Dit is het Midi-kanaal waarover het liedje gestuurd wordt. Hier staat kanaal 1 (eigenlijk kanaal $1, in programma's beginnen ze bij kanaal $0) wat voor muzikanten hetzelfde is als kanaal 2 (die beginnen te tellen met kanaal 1). De TB-3 staat standaard ingesteld op kanaal 2 (= $1).
  • Octave: In welk octaaf het liedje wordt gespeeld. Hier dus oktaaf 3.
  • StartNote en EindNote: De eerste noot en de laatste noot die afgespeeld wordt (geteld vanaf nummer 0 - Laatste noot is nummer 9).
  • Ctrl: De Controle-nummer die aangeeft welke Controler wordt aangestuurd.
  • Notes[10]: Het liedje, dat hier 10 noten lang is (noot 0 tot en met noot 9).

Veel dingen in het programma zullen bekend voorkomen, zoals de snelheid van Midi (31250 Baud), de noot berekening met oktaaf-berekening erbij, de NoteOn en NoteOff momenten, De teller contructie die de volgende noot zal bepalen. De rest is recht-toe recht-aan opgezet.

Elk Midi commando ($80..$E0) heeft zijn eigen functie, compleet met het juiste aantal parameters (2 of 1 stuks). Wat hier nog ontbreekt zijn functies voor Systeem Common Commando's. Deze vond ik op dit moment niet relevant om uit te werken, gezien het uiteindelijke doel voor de 2 vervolg projecten, namelijk het Midi-In gedeelte voor de Led-Panelen en voor de Sid Synthesizer.

De conclusie op dit moment is dat de Midi-out naar behoren werkt.


Broncode: [1: Midi Out]

1: De broncode van Midi Out

(Thu 31 July 2014) Eenvoudig testprogramma voor Midi Out - Een eenvoudige Muziekdoos.

Deze broncode heeft 119 regels met programma-code.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//
// Midi Out test
// A simple program to play a tune to a Midi Machine
//

byte Channel   =  1;  // Begint vanaf $0
byte Octave    =  3;
byte StartNote =  0;
byte EindNote  =  9;
byte Ctrl      = 16;

const int Notes [10]  = { 0,0,0,2,4,4,2,4,5,7 }; // Play a tune.
                // Please mind using the right number of notes between the [ and ]
byte Note=0;
byte NoteCount=StartNote;
byte Counter2=0;


void setup()
{ Init_Led();
  Serial.begin(31250);
  delay(100);
}


void loop()
{ Note = (Octave * 12) + Notes[NoteCount];

  Status( Note, Counter2);

  Control(Ctrl,Counter2);
  delay(10);

  NoteOn (Note,127);
  delay(250);
  NoteOff(Note,  0);


  if ( NoteCount < EindNote )
     { NoteCount=NoteCount + 1;
     }
  else
     { NoteCount = StartNote;
       Counter2= ( Counter2 + 8 ) & 0x7F;
     }
}


void Status(byte S1, byte S2)
{ digitalWrite(13, LOW);            // Hold Data
  shiftOut( 11, 12, MSBFIRST, S1);  // Send first byte
  shiftOut( 11, 12, MSBFIRST, S2);  // Send second byte
  digitalWrite(13, HIGH);           // Show Data
}

void Init_Led()
{ DDRC = DDRC | B00000111;    // pinMode(a , OUTPUT); pinMode(b , OUTPUT); pinMode(c , OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
}


void Led_Out(byte Nr)
{ PORTC = ( PORTC & B11111000 ) | (Nr & 0x07);
}

void NoteOff (byte N1, byte V2)
{ Led_Out(8);
  byte Command = 0x80 | Channel;
  Serial.write (Command);
  Serial.write(N1);
  Serial.write(V2);
}

void NoteOn (byte N1, byte V2)
{ Led_Out(9);
  byte Command = 0x90 | Channel;
  Serial.write (Command);
  Serial.write(N1);
  Serial.write(V2);
}

void AfterTouch (byte N1, byte V2)
{ Led_Out(10);
  byte Command = 0xA0 | Channel;
  Serial.write (Command);
  Serial.write(N1);
  Serial.write(V2);
}

void Control (byte C1, byte V2)
{ Led_Out(11);
  byte Command = 0xB0 | Channel;
  Serial.write (Command);
  Serial.write(C1);
  Serial.write(V2);
}

void ProgChange (byte P1)
{ Led_Out(12);
  byte Command = 0xC0 | Channel;
  Serial.write (Command);
  Serial.write(P1);
}

void ChannelAftertouch (byte V1)
{ Led_Out(13);
  byte Command = 0xD0 | Channel;
  Serial.write (Command);
  Serial.write(V1);
}

void PitchBend (byte L1, byte H2)
{ Led_Out(14);
  byte Command = 0xE0 | Channel;
  Serial.write (Command);
  Serial.write(L1);
  Serial.write(H2);


Broncode: [1: Midi Out] 

Afbeeldingen

midi_out_1.jpg
1/2: midi_out_1.jpg.
midi_out_2.jpg
2/2: midi_out_2.jpg.

De aansluitingen van Midi Out

Arduino Uno

Pwr USB ?
 
?
aref
gnd Gnd's (4x)
? d13 Latch (Front Leds)
ioreff d12 Clock (Front Leds)
reset d11 Data  (Front Leds)
+3.3v d10
+5v d9
Gnd's (4x) gnd d8
Gnd's (4x) gnd
Vin d7
d6
(Decoder Leds) A  (A0) a0 d5
(Decoder Leds) B  (A1) a1 d4
(Decoder Leds) C  (A2) a2 d3
a3 d2
a4 d1 Tx Midi out
a5 d0