DIY SH-101 Arpeggiator/Sequencer mit Arduino nachbauen?

updatetime :mrgreen:
hier nur fix die Keyboard-Schaltung:
fritzing:


fertig Oberseite:


und die Unterseite:


und hier die BOM (falls es jmd nachbauen möchte):
Code:
Assembly List
Label 	Part Type 	Properties
6N167 	6n137 Optocoupler 	Beinchenabstand 300mil; Variante variant 5; editable pin labels false; Paket DIP (Dual Inline) [THT]; chip label 6n137; Beinchen 8
9-11 	Generic male header - 3 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 3; Form ♂ (male)
C1 	Ceramic Capacitor 	Kapazität 22nF; Spannung 6.3V; Paket 100 mil [THT, multilayer]
C2 	Ceramic Capacitor 	Kapazität 22nF; Spannung 6.3V; Paket 100 mil [THT, multilayer]
C3 	Ceramic Capacitor 	Kapazität 100nF; Spannung 6.3V; Paket 100 mil [THT, multilayer]
C4 	Ceramic Capacitor 	Kapazität 100nF; Spannung 6.3V; Paket 100 mil [THT, multilayer]
C5 	Ceramic Capacitor 	Kapazität 100nF; Spannung 6.3V; Paket 100 mil [THT, multilayer]
C6 	Electrolytic Capacitor 	Kapazität 10µF; Spannung 35V; Paket 100 mil [THT, electrolytic]
C7 	Ceramic Capacitor 	Kapazität 100nF; Spannung 6.3V; Paket 100 mil [THT, multilayer]
columns 1-8 	Generic male header - 8 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 8; Form ♂ (male)
CRSTL 	Crystal 	Beinchenabstand 5.08mm; Frequenz 16 Mhz; Paket THT; Typ crystal
D2 	Signal Diode 	Paket 300 mil [THT]; Typ Rectifier; Bauteilnummer 1N 4148
D3 	Signal Diode 	Paket 300 mil [THT]; Typ Rectifier; Bauteilnummer 1N 4148
D3-D5 Conector 	Generic male header - 3 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 3; Form ♂ (male)
D4 	Signal Diode 	Paket 300 mil [THT]; Typ Rectifier; Bauteilnummer 1N4148
D5 	Signal Diode 	Paket 300 mil [THT]; Typ Rectifier; Bauteilnummer 1N4148
GND 	Generic male header - 1 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 1; Form ♂ (male)
GND/VCC In 	Generic male header - 2 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 2; Form ♂ (male)
HoldLED 	Orange (612nm) LED 	leg yes; Farbe Orange (612nm); Paket 3 mm [THT]
HoldLED/VCC 	Generic male header - 2 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 2; Form ♂ (male)
HoldTact 	SWITCH-MOMENTARY-2 	Variante 12mm; Paket tactile-pth-12mm
HoldTact(Signal) 	Generic male header - 1 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 1; Form ♂ (male)
MIDI_IN 	DIN-5 jack (MIDI) 	Paket THT; Beinchen 5; Form jack (female)
MIDI_OUT 	DIN-5 jack (MIDI) 	Paket THT; Beinchen 5; Form jack (female)
MidiIN 	Generic male header - 2 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 2; Form ♂ (male)
MidiOUT (Signal) 	Generic male header - 1 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 1; Form ♂ (male)
MidiOUT(5V) 	Generic male header - 1 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 1; Form ♂ (male)
Modulation 	Generic male header - 1 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 1; Form ♂ (male)
Pitchbend 	Generic male header - 1 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 1; Form ♂ (male)
PortamentoAmt 	Generic male header - 1 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 1; Form ♂ (male)
PtchB-VcfAmt 	Generic male header - 1 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 1; Form ♂ (male)
PtchB-VcoAmt 	Generic male header - 1 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 1; Form ♂ (male)
R1 	10kΩ Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 10kΩ; Paket THT
R2 	220Ω Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 220Ω; Paket THT
R3 	10kΩ Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 10kΩ; Paket THT
R4 	220Ω Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 220Ω; Paket THT
R5 	220Ω Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 220Ω; Paket THT
R6 	10kΩ Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 10kΩ; Paket THT
R7 	10kΩ Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 10kΩ; Paket THT
R8 	10kΩ Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 10kΩ; Paket THT
R9 	10kΩ Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 10kΩ; Paket THT
R10 	10kΩ Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 10kΩ; Paket THT
R11 	10kΩ Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 10kΩ; Paket THT
R12 	10kΩ Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 10kΩ; Paket THT
Row1-3 	Generic male header - 3 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 3; Form ♂ (male)
Row4-6 	Generic male header - 3 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 3; Form ♂ (male)
Transpose L-M-H 	SWITCH-SP3T 	poles 1; Paket switch-sp3t-smd; throws 3
U1 	74HC595 	Paket DIP16 [THT]; Typ 74HC595
U2 	74HC595 	Paket DIP16 [THT]; Typ 74HC595
U3 	atmega328 	Variante dip28 THT; Paket dip; Typ ATMEGA328; Version Atmega328-20PU

Shopping List
Amount 	Part Type 	Properties
1 	6n137 Optocoupler 	Beinchenabstand 300mil; Variante variant 5; editable pin labels false; Paket DIP (Dual Inline) [THT]; chip label 6n137; Beinchen 8
4 	Generic male header - 3 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 3; Form ♂ (male)
2 	Ceramic Capacitor 	Kapazität 22nF; Spannung 6.3V; Paket 100 mil [THT, multilayer]
4 	Ceramic Capacitor 	Kapazität 100nF; Spannung 6.3V; Paket 100 mil [THT, multilayer]
1 	Electrolytic Capacitor 	Kapazität 10µF; Spannung 35V; Paket 100 mil [THT, electrolytic]
1 	Generic male header - 8 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 8; Form ♂ (male)
1 	Crystal 	Beinchenabstand 5.08mm; Frequenz 16 Mhz; Paket THT; Typ crystal
4 	Signal Diode 	Paket 300 mil [THT]; Typ Rectifier; Bauteilnummer 1N4148
9 	Generic male header - 1 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 1; Form ♂ (male)
3 	Generic male header - 2 pins 	Beinchenabstand 0.1in (2.54mm); Lochgröße 1.0mm,0.508mm; row single; Paket THT; Beinchen 2; Form ♂ (male)
1 	Orange (612nm) LED 	leg yes; Farbe Orange (612nm); Paket 3 mm [THT]
1 	SWITCH-MOMENTARY-2 	Variante 12mm; Paket tactile-pth-12mm
2 	DIN-5 jack (MIDI) 	Paket THT; Beinchen 5; Form jack (female)
9 	10kΩ Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 10kΩ; Paket THT
3 	220Ω Resistor 	Beinchenabstand 400 mil; bands 4; Toleranz ±5%; Widerstand 220Ω; Paket THT
1 	SWITCH-SP3T 	poles 1; Paket switch-sp3t-smd; throws 3
2 	74HC595 	Paket DIP16 [THT]; Typ 74HC595
1 	atmega328 	Variante dip28 THT; Paket dip; Typ ATMEGA328; Version Atmega328-20PU

LG
-otto :kaffee:
 

Anhänge

  • Keyboard-MatrixBoard1.jpg
    Keyboard-MatrixBoard1.jpg
    91,1 KB · Aufrufe: 130
  • Keyboard-MatrixBoard2.jpg
    Keyboard-MatrixBoard2.jpg
    470,2 KB · Aufrufe: 129
  • Keyboard-MatrixBoard3.jpg
    Keyboard-MatrixBoard3.jpg
    483,6 KB · Aufrufe: 129
wiedermal updatetime ;-)

Die Klaviatur mit der Schaltung aus dem vorherigen Post funzt prima :mrgreen:
Den dazugehörigen code hab ich von hier geborgt und für meine Zwecke nachgebessert.

Der Hold-Button + dazugehöriger LED funzen recht gut - nunja, mein Laienhafter Code verhindert nach dem drücken der Holdtaste, dass der NoteOFF-Befehl für die jeweilige Keyboardtaste gesendet wird. Dadurch wird die gehaltene Note aber nicht noch einmal triggerbar solange die Hold-LED leuchtet. Übertreibt man es, indem man alle Tasten durchklimpert, geht am Ende nix mehr, bis man erneut die Holdtaste drückt.
Für einfache sachen ausreichend aber ich werde nochmal versuchen, dass zu verfeinern.

Den Transpose-Schalter (+/- 1 Octave hoch-, bzw. runter) musste ich von den Schieberegistern abziehen und an die beiden noch freien digitaleingänge der MCU hängen, um ihn zum funktionieren zu bewegen. Klappt aber jetzt super 8)


Nun zu den Poti-Schaltungen:
Hier das Layout in fritzing: (überarbeitete Version)


und hier die fertigen platinen:
Oberseite


Unterseite


Diese werden per Flachbandkabel miteinander verbunden (siehe fritzingbild).
Macht am Ende 32 analoge Eingänge, welche hier noch einmal aufgeführt sind:
Code:
Mux1
000	Pin13	LFO Rate
001	Pin14	LFO WaveForm
010	Pin15	Pitch Modulation
011	Pin12	PulseWidth
100	Pin1	PulseWidthMod (LFO,Main,Env)
101	Pin5	SawWave-volume
110	Pin2	SquareWave-volume
111	Pin4	SubOsc-volume

Mux2
000	Pin13	Noise-volume
001	Pin14	Frequency
010	Pin15	SubOsc-Tune
011	Pin12	Cutoff
100	Pin1	Envelope-Amount
101	Pin5	Keyboard (FilterModulationAmount)
110	Pin2	Resonance
111	Pin4	Mod Amount

Mux3
000	Pin13	12,18,24 dB/Oct
001	Pin14	Attack
010	Pin15	Decay
011	Pin12	Sustain
100	Pin1	Release
101	Pin5	Main-Volume
110	Pin2	(Switch) VCA Gate/LFO (on/off-state -> on=5v(High); off=0V(Low)(using a PulldownResistor 10k))
111	Pin4	(Button) Rec (with PullDownResistor 10k; Value: High=pressed/Low=unpressed)

Mux4	(ButtonMux)
000	Pin13	Rest				->connector_4b
001	Pin14	Tie					->connector_4b
010	Pin15	Accent			->connector_4b
011	Pin12	Half				->connector_4b
100	Pin1	Strum				->connector_4a
101	Pin5	SeqClear		->connector_4a
110	Pin2	StepDel			->connector_4a
111	Pin4	StepClear		->connector_4a

A4 as Output:		RecLED (Blink= RecordMode ON; no blink= RecordMode OFF)

HOLD Button & LED is in the Keyboardcircuit

Start/Stop-Buttons removed - same function as the MidiSeq-Circuit-Button


Sooo... jetzt gehts ans programieren.. mal sehen, ob das was wird.. :pcsuxx: :floet: :mrgreen:

LG
-otto
:kaffee:
 

Anhänge

  • MidiController Poti-MCU v0.2b.png
    MidiController Poti-MCU v0.2b.png
    258,8 KB · Aufrufe: 108
  • IMAG1269.jpg
    IMAG1269.jpg
    690 KB · Aufrufe: 108
  • IMAG1270.jpg
    IMAG1270.jpg
    827,3 KB · Aufrufe: 107
wirst ungeduldig? :mrgreen:

bin dran:
- code für Klaviatur incl. HOLD-Taste und Schalter für +-1 Octave funzt soweit ganz gut (HOLD-Taste muss ich aber nochmal überarbeiten)
- code für die Taster steht auch (debouncing)
- code für die Potis steht auch

aaaaber:
ich warte noch immer auf meine bestellten restlichen 10k potis :sad:

sobald die da sind, wird alles verkabelt und im zusammenspiel getestet :mrgreen:
hoffentlich funzt das dann alles wie geplant :floet:

hier ein paar Bilder des aktuellen Prototypen:




und hier bissl code zum spaß :lollo:
Code:
/*
//MultiplexerIC and Controller-Layout
//Mux1
//000	Pin13	LFO Rate                        CC#12
//001	Pin14	LFO WaveForm                    CC#13
//010	Pin15	Pitch Modulation                CC#14
//011	Pin12	PulseWidth                      CC#15
//100	Pin1	PulseWidthMod (LFO,Main,Env)    CC#16 (0%-33%=LFO, 34%-66%=Main, 67%-100%=Env)
//101	Pin5	SawWave-volume                  CC#20
//110	Pin2	SquareWave-volume               CC#19
//111	Pin4	SubOsc-volume                   CC#21

//Mux2
//000	Pin13	Noise-volume                    CC#22
//001	Pin14	Frequency                       CC#17
//010	Pin15	SubOsc-Tune                     CC#18
//011	Pin12	Cutoff                          CC#23
//100	Pin1	Envelope-Amount                 CC#25
//101	Pin5	Keyboard (FilterModulationAmt)  CC#27
//110	Pin2	Resonance                       CC#24
//111	Pin4	Mod Amount                      CC#26

//Mux3
//000	Pin13	12,18,24 dB/Oct                 CC#28 (0%-33%=12dB, 34%-66%=18dB, 67%-100%=24dB/Oct)
//001	Pin14	Attack                          CC#30
//010	Pin15	Decay                           CC#31
//011	Pin12	Sustain                         CC#33
//100	Pin1	Release                         CC#34
//101	Pin5	Main-Volume                     CC#35
//110	Pin2	(Switch) VCA Gate/LFO           CC#29 (on/off-state -> on=5v(High); off=0V(Low)--> digitalRead)
//111	Pin4	--free-- bzw. GND               GND (not used)

//Mux4 all Pin's at GND
//not used yet - maybe later for an additional controllerbox
//or a filterEnvelope using the env-controllers with a double-4-way-switch to change between Filter/Amp-Env

//MCU DigitalInputs without pulldownResistors - they get the internal pullUpResistors enabled
//MCU	DigitalPin5	  StepClear CC#109
//MCU	DigitalPin6	  Half      CC#110
//MCU	DigitalPin7	  Accent		CC#111
//MCU	DigitalPin8	  Tie       CC#112
//MCU	DigitalPin9	  Strum 		CC#113
//MCU	DigitalPin10	Rest      CC#117
//MCU	DigitalPin11	StepDel		CC#118
//MCU	DigitalPin12	SeqClear  CC#119
//MCU	DigitalPin13  Rec       CC#116---not used on digitalPin13: recTact is used on A4

//A4 as Input:    5v to RecTact to A4 and 10k to GND (Pulldownresistor)
//A5 as Output:		RecLED (Blink/Lit= RecordMode ON; no blink/no Lit= RecordMode OFF)

//HOLD Button & LED is in the Keyboardcircuit

//getting multiple button check w/ debounce from here: ("once"-version)
//http://ediy.com.my/index.php/tutorials/item/96-debouncing-multiple-switches
//------------------------------------------------------------------------------------------------------------------
*/

//#define SERIAL_RATE 31250   //MIDI baud rate (31250)
#define SERIAL_RATE 9200      //debug for serial-monitor

//-----debouncing-multiple-switches-----------------------------------------------------------------------------
#define DEBOUNCE 10           // how many ms to debounce, 5+ ms is usually plenty

//define the buttons (digitalPins) that we'll use
byte buttons[] = {5, 6, 7, 8, 9, 10, 11, 12}; 

//determine how big the array up above is, by checking the size
#define NUMBUTTONS sizeof(buttons)

//track if a button is just pressed, just released, or 'currently pressed' 
byte pressed[NUMBUTTONS], justpressed[NUMBUTTONS], justreleased[NUMBUTTONS];
byte previous_keystate[NUMBUTTONS], current_keystate[NUMBUTTONS];
//--------------------------------------------------------------------------------------------------------------


int controlChange = 176;      //Midikanal 1

//recTact-button
//int controllerNummer = 116; //CC# für RecMode ON/OFF für sequencer
//                                                                                             23  24  25  26  27  28  29  30  31rec
//ControllerArray (von 0 bis 31 = insgesamt 32 controller)                                     SCL Hlf Acc Tie STR Rst SDL SeqClr
int controllerNummer[] = {33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,109,110,111,112,113,117,118,119,116};
//int controllerNummer[] = {12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,33,34,35,109,110,111,112,113,117,118,119,116};
int controllerWert[23];
int controllerWertAlt[23];


//-------------------------------------
int potiWert[23];             //8 Potis per mux: 0-7(controllerNummer12-19) mux1, 8-15(20-27) mux2, 16-23(28-35) mux3
int smoothWert = 0;
int i = 0;
int potiWertAlt[23];          //8 Potis per mux: 0-7(controllerNummer12-19) mux1, 8-15(20-27) mux2, 16-23(28-35) mux3
int quickSmooth = 0;
int differenz = 0;
boolean quickAktiv = false;
int x = 0;

int bit0 = 0;
int bit1 = 0;
int bit2 = 0;

int muxBitPin0 = 2;           //selectPin 0 of the multiplexer (mux1-4)
int muxBitPin1 = 3;           //selectPin 1 of the multiplexer (mux1-4)
int muxBitPin2 = 4;           //selectPin 2 of the multiplexer (mux1-4)

int Ax = 0;
int analogInRecTact = A4;     //analogInput A4 is for the RecTact-Button, used as DigitalInput (High/Low)
int analogOutRecLED = A5;     //analogInput A5 is set to act as an Output to drive the RecLED (recordmode ON = LED lit)
boolean recTactState = LOW;
int recOn = 0;
int once = 0;



//--start-------------------------------------------------------------------------------------------------------
void setup() {
  pinMode(2, OUTPUT);         //muxBitPin1  mux1-4 parallel connected
  pinMode(3, OUTPUT);         //muxBitPin2  mux1-4 parallel connected
  pinMode(4, OUTPUT);         //muxBitPin3  mux1-4 parallel connected
  pinMode(A5, OUTPUT);        //RecLED ON/OFF
  pinMode(A4, INPUT);         //RecTact InputPin
  Serial.begin(SERIAL_RATE);

//-----debouncing-multiple-switches-----
  byte i;
  //Serial.print("Button checker with "); //debug for serial-monitor
  //Serial.print(NUMBUTTONS, DEC);        //debug for serial-monitor
  //Serial.println(" buttons");           //debug for serial-monitor
  // Make input & enable pull-up resistors on switch pins
  for (i=0; i< NUMBUTTONS; i++) {
    pinMode(buttons[i], INPUT);
    digitalWrite(buttons[i], HIGH);
  }
//--------------------------------------
}



//voidloop------MainLoop----------------------------------------------------------------------------------------
void loop() {
  for ( i = 0 ; i <= 7; i++ ) {
    bit0 = bitRead(i, 0);
    bit1 = bitRead(i, 1);
    bit2 = bitRead(i, 2);
      
    //digitalWrite(muxBitPin0, bit0);
    //digitalWrite(muxBitPin1, bit1);
    //digitalWrite(muxBitPin2, bit2);

    //recTactAbfrage();
    check_switches();
    potiAbfrage(i, A0);
    //potiAbfrage(i+8, A1);
    //potiAbfrage(i+16, A2);
    //potiAbfrage(i+24, A3);    //analogOut of mux4: mux4 not used yet

//-----debouncing-multiple-switches-----
    byte thisSwitch=thisSwitch_justPressed();
    switch(thisSwitch)
    {  
    case 0: //pin5  CC#109 StepClear
      //Serial.println("switch 1 just pressed CC#109 StepClear");    //debug for serial-monitor
      sendMidi(controlChange, controllerNummer[23], 127);
      sendMidi(controlChange, controllerNummer[23], 0);
      break;
    case 1: //pin6  CC#110 Half
      //Serial.println("switch 2 just pressed CC#110 Half");    //debug for serial-monitor
      sendMidi(controlChange, controllerNummer[24], 127);
      sendMidi(controlChange, controllerNummer[24], 0);
      break;
    case 2: //pin7  CC#111 Accent
      //Serial.println("switch 3 just pressed CC#111 Accent");    //debug for serial-monitor
      sendMidi(controlChange, controllerNummer[25], 127);
      sendMidi(controlChange, controllerNummer[25], 0);
      break;
    case 3: //pin8  CC#112 Tie
      //Serial.println("switch 4 just pressed CC#112 Tie");    //debug for serial-monitor
      sendMidi(controlChange, controllerNummer[26], 127);
      sendMidi(controlChange, controllerNummer[26], 0);
      break;
    case 4: //pin9  CC#113 Strum
      //Serial.println("switch 5 just pressed CC#113 Strum");    //debug for serial-monitor
      sendMidi(controlChange, controllerNummer[27], 127);
      sendMidi(controlChange, controllerNummer[27], 0);
      break;
    case 5: //pin10 CC#117 Rest
      //Serial.println("switch 6 just pressed CC#117 Rest");    //debug for serial-monitor
      sendMidi(controlChange, controllerNummer[28], 127);
      sendMidi(controlChange, controllerNummer[28], 0);
      break;
    case 6: //pin11 CC#118 StepDel
      //Serial.println("switch 7 just pressed CC#118 StepDel");    //debug for serial-monitor
      sendMidi(controlChange, controllerNummer[29], 127);
      sendMidi(controlChange, controllerNummer[29], 0);
      break;
    case 7: //pin12 CC#119 SeqClear
      //Serial.println("switch 8 just pressed CC#119 SeqClear");    //debug for serial-monitor
      sendMidi(controlChange, controllerNummer[30], 127);
      sendMidi(controlChange, controllerNummer[30], 0);
      break;
    }
//--------------------------------------
  }
}
//----------------voidloop-End----------------------------------------------------------------------------------




//PotiAbfrage---------------------------------------------------------------------------------------------------
void potiAbfrage(int i, int Ax) {
  potiWert[i] = analogRead(Ax);  //potiWert ranges from 0-1023
    
  //smoothWert = 0.6 * smoothWert + 0.4 * analogRead(A0);
  smoothWert = (smoothWert * 10) + (analogRead(Ax) * 6);
  smoothWert = (smoothWert + 8) >> 4;
    
  differenz = abs(potiWert[i] - controllerWertAlt[i]);
  
  if (differenz <= 5 && quickAktiv == false) {
    //quickSmooth = 0.6 * smoothWert + 0.4 * analogRead(A0);
    quickSmooth = (smoothWert * 10) + (analogRead(Ax) * 6);
    quickSmooth = (smoothWert + 8) >> 4;
  }
  else if (differenz <= 5 && quickAktiv == true){
    quickSmooth = analogRead(Ax);
    x++;
  }
  else {
    quickSmooth = analogRead(Ax);
    quickAktiv = true;
  };
  
  if (x >= 10) {
    x = 0;
    quickAktiv = false;
  };
  
  controllerWert[i] = map(potiWert[i],0,1023,127,0);

  //eliminate shaking between 0 & 1
  if (controllerWert[i] <= 1) {
    controllerWert[i] = 0;
  }
  
  if(controllerWert[i] != controllerWertAlt[i]) {
    sendMidi(controlChange, controllerNummer[i], controllerWert[i]);
  }
  controllerWertAlt[i] = controllerWert[i];
}




//recTactAbfrage (if pressed, LED is lit and send MidiCC#116 once to the sequencer to start RecordMode)---------
void recTactAbfrage() {
  int recTact = digitalRead(analogInRecTact);
  if(debounceButton(recTactState) == HIGH && recTactState == LOW)
  {
   if(recOn != 1)
   {
     recOn++;
     once++;
     recTactState = HIGH;
   }
   else if(recOn == 1)
   {
     digitalWrite(analogOutRecLED,LOW);                 //recLED OFF
     recOn = 0;
     once = 0;
     recTactState = HIGH;
     sendMidi(controlChange, controllerNummer[31], 0);  //31 = CC#116 recModeOFF
   }
  }
  else if(debounceButton(recTactState) == LOW && recTactState == HIGH)
  {
    recTactState = LOW;
  }
  if(recOn == 1 && once == 1)
  {
    digitalWrite(analogOutRecLED,HIGH);                  //recLED ON
    once = 0;
    sendMidi(controlChange, controllerNummer[31], 127);  //31 = CC#116 recModeON
  }
}




//-------debouncing-multiple-switches---------------------------------------------------------------------------
void check_switches() {
  static byte previousstate[NUMBUTTONS];
  static byte currentstate[NUMBUTTONS];
  static long lasttime;
  byte index;
  if (millis() < lasttime) {
    // we wrapped around, lets just try again
    lasttime = millis();
  }
  if ((lasttime + DEBOUNCE) > millis()) {
    // not enough time has passed to debounce
    return; 
  }
  // ok we have waited DEBOUNCE milliseconds, lets reset the timer
  lasttime = millis();
  for (index = 0; index < NUMBUTTONS; index++) {
    justpressed[index] = 0;       //when we start, we clear out the "just" indicators
    justreleased[index] = 0;
    currentstate[index] = digitalRead(buttons[index]);   //read the button
    if (currentstate[index] == previousstate[index]) {
      if ((pressed[index] == LOW) && (currentstate[index] == LOW)) {
        // just pressed
        justpressed[index] = 1;
      }
      else if ((pressed[index] == HIGH) && (currentstate[index] == HIGH)) {
        justreleased[index] = 1; // just released
      }
      pressed[index] = !currentstate[index];  //remember, digital HIGH means NOT pressed
    }
    previousstate[index] = currentstate[index]; //keep a running tally of the buttons
  }
}
 
byte thisSwitch_justPressed() {
  byte thisSwitch = 255;
  check_switches();  //check the switches & get the current state
  for (byte i = 0; i < NUMBUTTONS; i++) {
    current_keystate[i]=justpressed[i];
    if (current_keystate[i] != previous_keystate[i]) {
      if (current_keystate[i]) thisSwitch=i;
    }
    previous_keystate[i]=current_keystate[i];
  }  
  return thisSwitch;
}




//MidiSend-Function---------------------------------------------------------------------------------------------
void sendMidi(int statusByte, int dataByte1, int dataByte2) {
  Serial.write(statusByte);
  Serial.write(dataByte1);
  Serial.write(dataByte2);
  //Serial.print(statusByte);   //debug for serial-monitor
  //Serial.print("  ");         //debug for serial-monitor
  //Serial.print(dataByte1);    //debug for serial-monitor
  //Serial.print("  ");         //debug for serial-monitor
  //Serial.println(dataByte2);  //debug for serial-monitor
}




//debounce-Routine-recTact--------------------------------------------------------------------------------------
boolean debounceButton(boolean state)
{
  boolean stateNow = digitalRead(analogInRecTact);
  if(state!=stateNow)
  {
    delay(DEBOUNCE);
    stateNow = digitalRead(analogInRecTact);
  }
  return stateNow; 
}
ob der so funzt, werde ich dann sehen..
ganz sicher was die Befehle angeht, welche die Buttons senden, bin ich mir noch nicht (ob da einmal 127 UND 0 gesendet werden muss) aber, das werde ich dann im zusammenspiel sehen..

so long
-otto :kaffee:
 

Anhänge

  • IMAG1274.jpg
    IMAG1274.jpg
    591,8 KB · Aufrufe: 84
  • IMAG1277.jpg
    IMAG1277.jpg
    617,5 KB · Aufrufe: 85
  • IMAG1279.jpg
    IMAG1279.jpg
    356,6 KB · Aufrufe: 87
mal eine Frage zwischendurch: Hat der neue Korg Minilogue nicht auch einen sehr ähnlichen Sequncer wie der SH-101 ?
Und kann man die Sequencen nicht via Midi an andere Synth senden?
 
Chris_EOS schrieb:
mal eine Frage zwischendurch: Hat der neue Korg Minilogue nicht auch einen sehr ähnlichen Sequncer wie der SH-101 ?
Und kann man die Sequencen nicht via Midi an andere Synth senden?
Ja und Nein. Das Kernelement des SH-101 Sequencers, nämlich dass man den Zeitpunkt eines Sequenz-Schritts durch einen externen Clock-Trigger bestimmen kann, das funktioniert beim Minilogue nicht.
 
fanwander schrieb:
Chris_EOS schrieb:
mal eine Frage zwischendurch: Hat der neue Korg Minilogue nicht auch einen sehr ähnlichen Sequncer wie der SH-101 ?
Und kann man die Sequencen nicht via Midi an andere Synth senden?
Ja und Nein. Das Kernelement des SH-101 Sequencers, nämlich dass man den Zeitpunkt eines Sequenz-Schritts durch einen externen Clock-Trigger bestimmen kann, das funktioniert beim Minilogue nicht.

Auch nicht mit dem Arturia Beatstep Pro ?
 
Chris_EOS schrieb:
Auch nicht mit dem Arturia Beatstep Pro ?
Nein, das geht aus Prinzip nicht. Ich habe das in meinem Test auf amazona.de beschrieben: Auch wenn man das Tempo des MIDI-Clock abrupt ändert, dann wackelt der Sequenzer hinter dem Tempowechsel hinterher. Er verliert zwar keinen Beat, aber er kommt aus dem Tritt. Offensichtlich gibt es keinen direkten Zusammenhang zwischen Clock-Event und Sequencer-Event. Die Clock-Frequenz wird nur als Vergleichswert für eine interne PLL-Funktion benutzt. Egal ob die Clock-Quelle jetzt MIDI oder der "analog"-Clock ist.

Das ganze ist vermutlich deswegen so gemacht, weil Korg immer an der Swing-Funktion festhalten wollte. Das ginge aber nicht, wenn es eine feste Relation zwischen Clock-Event und Sequencer-Event gäbe. Ich hab ja auch in meinem Test angemerkt, dass man bei Triggerung durch "analoge" Clocksignale gerne auf den Swing verzichten würde. Der Swing darf ja für MIDI-Clock erhalten bleiben.
 
soooo... nach langer Pause hier nun das funktionierende resultat 8)

https://youtu.be/LsR9MPbzHAs
4 spuren micromodular gesteuert vom midicontroller (einzeln nacheinander recordet natürlich)


und nochn paar bilder :)





:kaffee:
 

Anhänge

  • DSC_0226.JPG
    DSC_0226.JPG
    664,4 KB · Aufrufe: 18
  • DSC_0227.JPG
    DSC_0227.JPG
    737,8 KB · Aufrufe: 17
  • IMG-20170109-WA0009.jpeg
    IMG-20170109-WA0009.jpeg
    702,7 KB · Aufrufe: 16
  • IMG-20170109-WA0011.jpeg
    IMG-20170109-WA0011.jpeg
    762,3 KB · Aufrufe: 18

Similar threads

B
Antworten
19
Aufrufe
2K
Anonymous
A


Neueste Beiträge

News

Zurück
Oben