{"id":372,"date":"2021-02-07T20:14:05","date_gmt":"2021-02-07T19:14:05","guid":{"rendered":"http:\/\/www.hman-projects.de\/?p=372"},"modified":"2021-02-07T20:14:05","modified_gmt":"2021-02-07T19:14:05","slug":"arduino-16-step-drum-sequencer-diy-arduino","status":"publish","type":"post","link":"https:\/\/www.hman-projects.de\/?p=372","title":{"rendered":"Arduino 16 Step Drum Sequencer #DIY # Arduino"},"content":{"rendered":"\n<p>Based on a Arduino, I had build a 16 Step Drum Sequencer which triggers Drum-Sounds via MIDI.<\/p>\n\n\n\n<figure class=\"wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"16 Step Drum Sequencer\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/ddTLvfzOs-k?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>To use 3 PCF 8475 ICs was inspired by this Video:<\/p>\n\n\n\n<figure class=\"wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"HariFun #133 - 8 LEDs, 8 Buttons, just 2 Arduino pins!\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/-VC_Y8qbeQM?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>My Code is not really ready to\u00a0all things in the menu, but perhaps &#8211; it could be a good starting-point for Your next project. <\/p>\n\n\n\n<p>This code here is not 1:1 the code in the video because I lost that version. The here is very close to the Video.<\/p>\n\n\n\n<p>\/\/ E.Heinemann<\/p>\n\n\n\n<p>\/\/ 30.10.2016 &#8211; Bonn Germany<\/p>\n\n\n\n<p>\/\/ Helping sources:<\/p>\n\n\n\n<p>\/\/ https:\/\/learn.sparkfun.com\/tutorials\/midi-shield-hookup-guide\/example-1-clock-generator&#8211;receiver<\/p>\n\n\n\n<p>#include &lt;Wire.h&gt;<\/p>\n\n\n\n<p>#include &lt;MIDI.h&gt;<\/p>\n\n\n\n<p>#include &lt;LiquidCrystal_I2C.h&gt;<\/p>\n\n\n\n<p>\/\/ http:\/\/www.86duino.com\/?p=8254<\/p>\n\n\n\n<p>#include &#8222;TimerOne.h&#8220;<\/p>\n\n\n\n<p>\/\/ http:\/\/playground.arduino.cc\/Main\/MsTimer2<\/p>\n\n\n\n<p>\/\/ #in clude &lt;MsTimer2.h&gt;<\/p>\n\n\n\n<p>\/\/ other interesting Project:<\/p>\n\n\n\n<p>\/\/ http:\/\/skagmo.com<\/p>\n\n\n\n<p>\/\/ https:\/\/www.youtube.com\/watch?v=q9LyRmzGL5g<\/p>\n\n\n\n<p>\/\/ https:\/\/github.com\/Catmacey\/DrumMachine<\/p>\n\n\n\n<p>\/\/ Projects to build the Drum-Synths<\/p>\n\n\n\n<p>\/\/ http:\/\/dmitry.gr\/index.php?r=05.Projects&amp;proj=02.%20Single-chip%20audio%20Player<\/p>\n\n\n\n<p>\/\/ http:\/\/www.enide.net\/webcms\/index.php?page=pcm2pwm<\/p>\n\n\n\n<p>\/\/ Coron DS7 http:\/\/m.bareille.free.fr\/ds7clone\/ds7.htm<\/p>\n\n\n\n<p>\/\/ http:\/\/electro-music.com\/forum\/phpbb-files\/dr_55_rimshot_clone_196.pdf<\/p>\n\n\n\n<p>\/\/ Monotribe schematic<\/p>\n\n\n\n<p>\/\/ Boss DR110 Scheamtics<\/p>\n\n\n\n<p>\/\/ http:\/\/www.sdiy.org\/richardc64\/new_drums\/dr110\/dr110a1.html<\/p>\n\n\n\n<p>\/\/ http:\/\/www.freeinfosociety.com\/electronics\/schemview.php?id=129<\/p>\n\n\n\n<p>\/\/ http:\/\/www.sdiy.org\/richardc64\/new_drums\/dr110\/clap_etc.html<\/p>\n\n\n\n<p>\/\/ Good example of needed sounds: http:\/\/delptronics.com\/ldb2e.php<\/p>\n\n\n\n<p>\/\/ http:\/\/pdp7.org\/boss_dr_sync\/bossdr110.html<\/p>\n\n\n\n<p>\/\/ http:\/\/www.theninhotline.net\/dr110\/<\/p>\n\n\n\n<p>\/\/ Pi Zero as SamplePlayer<\/p>\n\n\n\n<p>\/\/ https:\/\/www.raspberrypi.org\/forums\/viewtopic.php?f=38&amp;t=127585<\/p>\n\n\n\n<p>\/\/ Mozzi-based Drum<\/p>\n\n\n\n<p>\/\/ https:\/\/github.com\/fakebitpolytechnic\/cheapsynth\/blob\/master\/Mozzi_drumsDG0_0_2BETA\/Mozzi_drumsDG0_0_2BETA.ino<\/p>\n\n\n\n<p>#include &lt;EEPROM.h&gt;<\/p>\n\n\n\n<p>\/\/ Softserial is used to send MIDI via Pin TX 2, RX 3&nbsp;<\/p>\n\n\n\n<p>#include &lt;SoftwareSerial.h&gt;<\/p>\n\n\n\n<p>SoftwareSerial softSerial(2,3);<\/p>\n\n\n\n<p>MIDI_CREATE_INSTANCE(SoftwareSerial, softSerial, midiA);<\/p>\n\n\n\n<p>\/\/ #define NBR_INST&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 16<\/p>\n\n\n\n<p>\/\/ #define NBR_PATTERN &nbsp; &nbsp; &nbsp; 16<\/p>\n\n\n\n<p>\/\/ #define NBR_MIDI_CH &nbsp; &nbsp; &nbsp; 10<\/p>\n\n\n\n<p>\/\/Midi message define<\/p>\n\n\n\n<p>\/\/ #define MIDI_START 0xfa<\/p>\n\n\n\n<p>\/\/ #define MIDI_STOP&nbsp; 0xfc<\/p>\n\n\n\n<p>\/\/ #define MIDI_CLOCK 0xf8<\/p>\n\n\n\n<p>\/\/ Not implemented yet<\/p>\n\n\n\n<p>uint16_t bpm = 125;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ Default BPM<\/p>\n\n\n\n<p>uint16_t old_bpm = bpm;&nbsp; &nbsp; &nbsp; \/\/ Default BPM<\/p>\n\n\n\n<p>uint8_t midi_channel = 10;&nbsp; &nbsp; \/\/ Default Midi Channel<\/p>\n\n\n\n<p>uint8_t midi_sync&nbsp; &nbsp; = 0; &nbsp; &nbsp; \/\/ 1 == Slave, 0 = Master &#8211; default<\/p>\n\n\n\n<p>uint8_t LCD_Address = 0x3B; &nbsp; \/\/ LCD is integrated via PCF8574 on Port 0x3B<\/p>\n\n\n\n<p>LiquidCrystal_I2C lcd(LCD_Address,16,2);&nbsp; \/\/ simple LCD with 16&#215;2<\/p>\n\n\n\n<p>uint8_t address1 = 0x3C; &nbsp; \/\/ Address of the PCF8574 for first 8 Buttons and LEDs<\/p>\n\n\n\n<p>uint8_t address2 = 0x38; &nbsp; \/\/ Address of the second PCF for LEDS &amp; Buttons 9 &#8211; 16<\/p>\n\n\n\n<p>\/\/ Button-Pins<\/p>\n\n\n\n<p>const int buttonPinS = 4; &nbsp; \/\/ Select ..near to the POT<\/p>\n\n\n\n<p>const int buttonPinL = 5; &nbsp; \/\/ Left- or Start-Button<\/p>\n\n\n\n<p>const int buttonPinR = 6; &nbsp; \/\/ Right- or Stop-Button<\/p>\n\n\n\n<p>\/\/ Value of the POT<\/p>\n\n\n\n<p>int &nbsp; &nbsp; aPin3 = 3;<\/p>\n\n\n\n<p>int &nbsp; &nbsp; aVal3;<\/p>\n\n\n\n<p>int &nbsp; &nbsp; old_aVal3;<\/p>\n\n\n\n<p>uint8_t newNote; \/\/ Variable for the MidiNote in the Menu<\/p>\n\n\n\n<p>uint8_t count_step =&nbsp; 0; &nbsp; \/\/ Step counter<\/p>\n\n\n\n<p>uint8_t count_bars = 16;&nbsp; \/\/ count steps per Pattern, .. with 2 PCF8574, I am able to define 16 Steps max&#8230;. virtually perhaps 32&#8230;.<\/p>\n\n\n\n<p>uint8_t count_ppqn =- 1;&nbsp; \/\/ 24 MIDI-Clock-Pulse per quart note counter<\/p>\n\n\n\n<p>\/\/ Menu<\/p>\n\n\n\n<p>String &nbsp; Modes[] = { &#8222;Instr&#8220;, &#8222;Velo&#8220;, &#8222;Speed&#8220;, &#8222;Bars&#8220;, &#8222;Note&#8220;, &#8222;Scale&#8220;, &#8222;Sync&#8220; };<\/p>\n\n\n\n<p>uint8_t&nbsp; ModesNum[] = { 0, 1, 2, 3 , 4, 5, 6 };<\/p>\n\n\n\n<p>\/\/ Is the Sequencer running or not<\/p>\n\n\n\n<p>boolean&nbsp; playBeats = true;<\/p>\n\n\n\n<p>\/\/ Current Menu Settings<\/p>\n\n\n\n<p>uint8_t curModeNum = 0;<\/p>\n\n\n\n<p>String&nbsp; curMode = Modes[0]; \/\/ Sound or Play<\/p>\n\n\n\n<p>\/\/ Instruments, Accent is not an Instrument but internally handled as an instrument<\/p>\n\n\n\n<p>const String shortSounds[] ={ &#8222;ACC&#8220; &nbsp; , &#8222;CHH&#8220;&nbsp; , &#8222;OHH&#8220; &nbsp; , &#8222;SN&#8220;&nbsp; &nbsp; , &#8222;CLP&#8220; , &#8222;BD&#8220;, &#8222;RID&#8220;, &#8222;MT&#8220;, &#8222;HT&#8220;, &#8222;RIM&#8220;, &#8222;LCO&#8220;, &#8222;HCO&#8220;, &#8222;TIM&#8220;, &#8222;i14&#8220;, &#8222;i15&#8220;, &#8222;i16&#8220; };<\/p>\n\n\n\n<p>const String Sounds[]&nbsp; &nbsp; &nbsp; ={ &#8222;Accent&#8220;, &#8222;Cl-HH&#8220;, &#8222;OP-HH&#8220; , &#8222;Snare&#8220; , &#8222;Clap&#8220;, &#8222;BD&#8220;, &#8222;Ride&#8220;, &#8222;Tom&#8220;, &#8222;Rim&#8220;, &#8222;LoConga&#8220;, &#8222;HiConga&#8220;, &#8222;i13&#8220;, &#8222;i14&#8243;,&#8220;i15&#8220; };<\/p>\n\n\n\n<p>uint8_t iSound[] ={ -1,&nbsp; 42, 44, 38,&nbsp; 39, 36, 55,43, &nbsp; 45, 37, 76, 77,&nbsp; 61, 49, 50, 51&nbsp; }; \/\/ MIDI-Sound, edited via Menu 50=TOM, 44=closed HH,&nbsp;<\/p>\n\n\n\n<p>uint8_t iVelo[]&nbsp; ={ 127, 90, 90, 90,&nbsp; 90, 90, 90, 90,&nbsp; 90, 90, 90, 90 }; \/\/ Velocity, edited via Menu<\/p>\n\n\n\n<p>uint8_t inotes1[]={ 255,255,255,255,255,255,255,255,&nbsp; 255,255,255,255,255,255,255,255, 255 };<\/p>\n\n\n\n<p>uint8_t inotes2[]={ 255,255,255,255,255,255,255,255,&nbsp; 255,255,255,255,255,255,255,255, 255 };<\/p>\n\n\n\n<p>\/\/ Current Instrument .. the first selected<\/p>\n\n\n\n<p>int curIns = 5; \/\/ 5 = BD<\/p>\n\n\n\n<p>uint16_t timer_time=5000; \/\/Time in microsecond of the callback fuction<\/p>\n\n\n\n<p>uint32_t tempo_delay;<\/p>\n\n\n\n<p>uint8_t bar_value[]={ 1, 2, 3, 4, 6, 8, 12, 16};<\/p>\n\n\n\n<p>\/\/ array of notes would be better, 2 bytes in notes for every instrument<\/p>\n\n\n\n<p>uint8_t notes1;&nbsp;<\/p>\n\n\n\n<p>uint8_t notes2;<\/p>\n\n\n\n<p>\/\/ Old MIDI-Tricks, HH-Sounds first, Cymbals first, Snare, BD at least,&nbsp; &#8230; to keep a tight beat<\/p>\n\n\n\n<p>uint8_t oldStatus1=B00000000;<\/p>\n\n\n\n<p>uint8_t oldStatus2=B00000000;<\/p>\n\n\n\n<p>uint8_t bits1 = 0;<\/p>\n\n\n\n<p>uint8_t bits2 = 0;<\/p>\n\n\n\n<p>\/\/ Scale, Menu to change Scale is yet not implemented<\/p>\n\n\n\n<p>uint8_t scale=1 ;\/\/Default scale&nbsp; 1\/16<\/p>\n\n\n\n<p>uint8_t&nbsp; &nbsp; &nbsp; scale_value[]&nbsp; = { &nbsp; &nbsp; 3,&nbsp; &nbsp; &nbsp; 6,&nbsp; &nbsp; 12, &nbsp; &nbsp; 24, &nbsp; &nbsp; &nbsp; 8, &nbsp; &nbsp; &nbsp; 16 };<\/p>\n\n\n\n<p>const String scale_string[] = { &#8222;1\/32&#8220;, &#8222;1\/16&#8220;, &#8222;1\/8&#8220;, &#8222;1\/4&#8220;,&nbsp; &#8222;1\/8T&#8220;, &nbsp; &#8222;1\/4T&#8220; };<\/p>\n\n\n\n<p>\/\/ BPM to MS Conversion<\/p>\n\n\n\n<p>\/\/ http:\/\/www.sengpielaudio.com\/Rechner-bpmtempotime.htm<\/p>\n\n\n\n<p>\/\/ myRefresh is only a counter .. the higher the lower the BPM! To display a good BPM this value has to be translated<\/p>\n\n\n\n<p>int myRefresh = 500;<\/p>\n\n\n\n<p>int myStep&nbsp; =&nbsp; 0;<\/p>\n\n\n\n<p>int veloAccent&nbsp; = 100;<\/p>\n\n\n\n<p>int velocity&nbsp; &nbsp; = 100;<\/p>\n\n\n\n<p>int step_position = 0;<\/p>\n\n\n\n<p>int b = 10;<\/p>\n\n\n\n<p>uint8_t&nbsp; count_instr = 00;<\/p>\n\n\n\n<p>boolean oldStateS=1;<\/p>\n\n\n\n<p>boolean buttonStateS=1;<\/p>\n\n\n\n<p>boolean oldStateL=1;<\/p>\n\n\n\n<p>boolean buttonStateL=1;<\/p>\n\n\n\n<p>boolean oldStateR=1;<\/p>\n\n\n\n<p>boolean buttonStateR=1;<\/p>\n\n\n\n<p>String curPattern1=&#8220;xxxxxxxxx&#8220;;<\/p>\n\n\n\n<p>String curPattern2=&#8220;xxxxxxxxx&#8220;;<\/p>\n\n\n\n<p>\/\/ ### Base-Function for PCF8574 and WIRE ###&nbsp;<\/p>\n\n\n\n<p>\/\/ PCF8574 Explosion Demo (using same pin for Input AND Output)<\/p>\n\n\n\n<p>\/\/ Hari Wiguna, 2016<\/p>\n\n\n\n<p>void WriteIo(uint8_t bits,uint8_t thisAddress)<\/p>\n\n\n\n<p>{<\/p>\n\n\n\n<p>&nbsp; Wire.beginTransmission(thisAddress);<\/p>\n\n\n\n<p>&nbsp; Wire.write(bits);<\/p>\n\n\n\n<p>&nbsp; Wire.endTransmission();<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>\/\/&nbsp; ### Base-Function for PCF8574 and WIRE ###&nbsp;<\/p>\n\n\n\n<p>\/\/ PCF8574 Explosion Demo (using same pin for Input AND Output)<\/p>\n\n\n\n<p>\/\/ Hari Wiguna, 2016<\/p>\n\n\n\n<p>uint8_t ReadIo( uint8_t address)<\/p>\n\n\n\n<p>{ &nbsp;<\/p>\n\n\n\n<p>&nbsp; WriteIo(B11111111, address);&nbsp; &nbsp; &nbsp; &nbsp; \/\/ PCF8574 require us to set all outputs to 1 before doing a read.<\/p>\n\n\n\n<p>&nbsp; Wire.beginTransmission(address);<\/p>\n\n\n\n<p>&nbsp; \/\/ Wire.write(B11111111);<\/p>\n\n\n\n<p>&nbsp; Wire.requestFrom((int)address, 1);&nbsp; \/\/ Ask for 1 byte from slave<\/p>\n\n\n\n<p>&nbsp; uint8_t bits = Wire.read(); &nbsp; &nbsp; &nbsp; &nbsp; \/\/ read that one byte<\/p>\n\n\n\n<p>&nbsp; Wire.requestFrom((int)address1, 1); \/\/ Ask for 1 byte from slave<\/p>\n\n\n\n<p>&nbsp; Wire.endTransmission();&nbsp;<\/p>\n\n\n\n<p>&nbsp; return bits;<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>\/\/ ########################### Show Notes and current Step via LEDs #########################<\/p>\n\n\n\n<p>void showStep ( int mystep, uint8_t address1, uint8_t address2, uint8_t notes1, uint8_t notes2&nbsp; )<\/p>\n\n\n\n<p>{<\/p>\n\n\n\n<p>&nbsp; uint8_t bitdp1 = notes1;<\/p>\n\n\n\n<p>&nbsp; uint8_t bitdp2 = notes2;<\/p>\n\n\n\n<p>&nbsp; \/\/ Current Step would be only shown if played<\/p>\n\n\n\n<p>&nbsp; if ( playBeats==true ) {&nbsp;<\/p>\n\n\n\n<p>&nbsp;&nbsp; if ( mystep &lt;&nbsp; 8 ) bitClear(bitdp1, step_position);<\/p>\n\n\n\n<p>&nbsp;&nbsp; if ( mystep &gt;= 8 ) bitClear(bitdp2, (step_position-8));<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; WriteIo( bitdp1, address1);<\/p>\n\n\n\n<p>&nbsp; WriteIo( bitdp2, address2);<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>\/\/ ############################ Play the Midi-Notes #####################################&nbsp;<\/p>\n\n\n\n<p>void Update_Midi() {<\/p>\n\n\n\n<p>&nbsp; \/\/ first 8 beats<\/p>\n\n\n\n<p>&nbsp;&nbsp; if (playBeats==true)<\/p>\n\n\n\n<p>&nbsp;&nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; veloAccent = 100; \/\/ Normal Velocity by default<\/p>\n\n\n\n<p>&nbsp; &nbsp; \/\/ first Byte or first 8 Hits<\/p>\n\n\n\n<p>&nbsp; &nbsp; if ( step_position&lt;8 ) \/\/ &#8222;song_position&#8220; is the current step&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; { \/\/ play notes1<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; \/\/ Accent set?<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; if (bitRead( inotes1[0],step_position ) == 0 ){<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Accent is set<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; veloAccent = iVelo[0];<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; }&nbsp;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; for (int i = 1; i &lt; count_instr; i++) \/\/ loop through all instruments .. But ignore Accent with 0<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if (bitRead( inotes1[i],step_position ) == 0)&nbsp;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; velocity&nbsp; = round(iVelo[i] * veloAccent \/ 100);<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( velocity &gt; 127 ) { velocity = 127; }<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; midiA.sendNoteOff( iSound[i], 0, 1);&nbsp; &nbsp; &nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; midiA.sendNoteOn(&nbsp; iSound[i], velocity ,1);<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; \/\/ second Byte or second 8 Steps<\/p>\n\n\n\n<p>&nbsp; &nbsp; if ( step_position &gt;= 8 ) \/\/ bitClear(bitdp2, (a-8));<\/p>\n\n\n\n<p>&nbsp; &nbsp; { \/\/ play Notes2<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; if (bitRead( inotes2[0],step_position ) == 0)<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; { \/\/ Accent is set<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; veloAccent = iVelo[0];<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; }&nbsp;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; for (int i = 1; i &lt; count_instr; i++) \/\/ loop through all instruments .. but ignore the Accent with 0<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if (bitRead( inotes2[i],(step_position-8) ) == 0) {<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; velocity&nbsp; = round(iVelo[i] * veloAccent \/ 100);<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( velocity &gt; 127 ) { velocity = 127; }<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; midiA.sendNoteOff( iSound[i], 0, 1 &nbsp; &nbsp; &nbsp; );&nbsp; &nbsp; &nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; midiA.sendNoteOn( iSound[i], velocity ,1 );<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>\/\/ ############################## Select another Instrument and update all variables and LCD ###########<\/p>\n\n\n\n<p>void Select_Instr( int newIns ) {<\/p>\n\n\n\n<p>&nbsp;\/\/&nbsp; if ( newIns != curIns ) {<\/p>\n\n\n\n<p>&nbsp; &nbsp; curIns = newIns;<\/p>\n\n\n\n<p>&nbsp; &nbsp; if ( newIns &gt;= count_instr ) {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; curIns = count_instr-1;&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; }&nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; lcd.setCursor(0,0);<\/p>\n\n\n\n<p>&nbsp; &nbsp; lcd.print( curMode&nbsp; + &#8220; &#8220; + Sounds[ curIns ]&nbsp; + &#8220; &#8220; + iVelo[ curIns ] +&#8220;&nbsp; &nbsp; &#8222;);<\/p>\n\n\n\n<p>&nbsp; &nbsp; curPattern1=&#8220;&#8220;;<\/p>\n\n\n\n<p>&nbsp; &nbsp; curPattern2=&#8220;&#8220;;<\/p>\n\n\n\n<p>&nbsp; &nbsp; notes1 = inotes1[curIns];<\/p>\n\n\n\n<p>&nbsp; &nbsp; notes2 = inotes2[curIns];&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; \/\/ Show new Pattern in Display<\/p>\n\n\n\n<p>&nbsp; &nbsp; for (int i = 1; i &lt; 8; i++)<\/p>\n\n\n\n<p>&nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if (bitRead( notes1, i ) == 0) {&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; curPattern1 = curPattern1 + &#8222;X&#8220;;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; } else<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; {&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; curPattern1 = curPattern1 + &#8222;-&#8222;;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if (bitRead( notes2, i ) == 0) {&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; curPattern2 = curPattern2 + &#8222;X&#8220;;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; } else<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; {&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; curPattern2 = curPattern2 + &#8222;-&#8222;;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; lcd.setCursor(0,1);<\/p>\n\n\n\n<p>&nbsp; &nbsp; lcd.print( curPattern1 + curPattern2);<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>\/\/ ################################ Check the Potentiometer ##############################<\/p>\n\n\n\n<p>void Check_POT() {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/ Check the POT &#8212; Menu-Functions<\/p>\n\n\n\n<p>&nbsp; &nbsp; aVal3 = round(analogRead(aPin3)\/8);<\/p>\n\n\n\n<p>&nbsp; &nbsp; if ( aVal3 != old_aVal3&nbsp; )<\/p>\n\n\n\n<p>&nbsp; &nbsp; {&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/ Correction<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; myStep = myStep + 120;&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if ( curModeNum==0 ) \/\/ Play and Sound-Select<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Select_Instr( round(aVal3\/8) ); &nbsp; &nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if ( curModeNum==1 ) \/\/ Velocity<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( aVal3 &gt; 127 ) { aVal3=127;}<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.setCursor(0,0);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.print( curMode + &#8220; &#8220; + String(aVal3) + &#8220; &#8220; + Sounds[ curIns ] + &#8220; &nbsp; &nbsp; &#8222;);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iVelo[ curIns ] = aVal3; &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if ( curModeNum==2 ) \/\/ Speed<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; old_bpm = bpm;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bpm = round(analogRead(aPin3)\/4 + 40);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.setCursor(0,0);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.print( curMode + &#8220; &#8220; + String(bpm) +&#8220; bpm &nbsp; &#8220;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tempo_delay = 60000000 \/ bpm \/ 24;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if ( curModeNum==3 ) \/\/ Bars<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( aVal3 &gt; 127 ) { aVal3=127;}<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count_bars = round(aVal3 \/ 8)+1;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( count_bars&gt;16 )&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { count_bars=16; } \/\/ max of this setup<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.setCursor(0,0);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.print( curMode + &#8220;&nbsp; &#8220; + String( count_bars ) +&#8220;&nbsp; &nbsp; &nbsp; &#8220;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if ( curModeNum==4&nbsp; &amp;&amp; curIns&gt;0 ) \/\/ Midi-Notes, perhaps we find a good Midi-Reference to replace Note and Name<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; { &nbsp; \/\/ 30 to 70 make sense<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newNote = round(aVal3\/3) + 25;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( newNote &gt; 70 ) { newNote =70;}<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( newNote &lt; 30 ) { newNote =30;}<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.setCursor(0,0);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.print( curMode + &#8220; &#8220; + String(newNote) + &#8220; &#8220; + Sounds[ curIns ] + &#8220; &nbsp; &nbsp; &#8222;);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iSound[ curIns ] = newNote;&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if ( curModeNum==5 ) \/\/ Scale<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( aVal3 &gt; 127 ) { aVal3=127;}<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scale = round(aVal3 \/ 16 );<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( scale &gt;= sizeof(scale_string) ) { scale = sizeof(scale_string)-1 ; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.setCursor(0,0);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.print( curMode + &#8220;&nbsp; &#8220; + scale_string[ scale ] +&#8220;&nbsp; &nbsp; &nbsp; &#8220;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; old_aVal3 = aVal3; &nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; }<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>\/\/ ################################ Check Menu &#8211; Buttons &#8211;#######################<\/p>\n\n\n\n<p>void Check_MENU() {<\/p>\n\n\n\n<p>&nbsp; &nbsp; \/\/ Check if Menu-Button or Start or Stop was pressed<\/p>\n\n\n\n<p>&nbsp; &nbsp; buttonStateS = digitalRead(buttonPinS);<\/p>\n\n\n\n<p>&nbsp; &nbsp; buttonStateL = digitalRead(buttonPinL);<\/p>\n\n\n\n<p>&nbsp; &nbsp; buttonStateR = digitalRead(buttonPinR);<\/p>\n\n\n\n<p>&nbsp; &nbsp; if ( oldStateS==1 &amp;&amp; buttonStateS == 0)<\/p>\n\n\n\n<p>&nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; curModeNum = curModeNum +1;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if ( curModeNum &gt;(5-playBeats) ) { curModeNum = 0 ;}&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; curMode= Modes[curModeNum];<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; lcd.setCursor(0,0);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if (curModeNum != 3 &amp;&amp; curModeNum != 2 &amp;&amp; curModeNum != 5)<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; lcd.print( curMode&nbsp; + &#8220; &#8220; + Sounds[ curIns ] +&#8220; &#8220; + buttonStateS&nbsp; + &#8220;&nbsp; &nbsp; &nbsp; &#8222;);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; } else<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; if ( curModeNum == 3 ) {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.print( curMode + &#8220;&nbsp; &#8220; + String( count_bars ) +&#8220;&nbsp; &nbsp; &nbsp; &#8220; );<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; if ( curModeNum == 2 ) { \/\/ Speed<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.print(&nbsp; curMode + &#8220; &#8220; + String(bpm) +&#8220; bpm&nbsp; &nbsp; &#8220; &nbsp; );<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; if ( curModeNum == 5 ) {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.setCursor(0,0);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.print( curMode + &#8220;&nbsp; &#8220; + scale_string[ scale ] +&#8220;&nbsp; &nbsp; &nbsp; &#8220;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; }&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; if ( playBeats == false &amp;&amp; buttonStateL != oldStateL &amp;&amp; buttonStateL == LOW )<\/p>\n\n\n\n<p>&nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/ Start-Button<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; step_position=0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; playBeats = true;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; lcd.setCursor(0,1);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; lcd.print( &#8222;Started Beating &#8222;);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ MIDI-Clock<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; midiA.sendRealTime(MIDI_NAMESPACE::Start);<\/p>\n\n\n\n<p>&nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; if ( playBeats == true &amp;&amp; buttonStateR != oldStateR &amp;&amp; buttonStateR == LOW )<\/p>\n\n\n\n<p>&nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/ Stop-Button<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; step_position=0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; playBeats = false;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; lcd.setCursor(0,1);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; lcd.print( &#8222;Stopped Beating &#8222;);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; midiA.sendRealTime(MIDI_NAMESPACE::Stop);<\/p>\n\n\n\n<p>&nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; oldStateS = buttonStateS;<\/p>\n\n\n\n<p>&nbsp; &nbsp; oldStateL = buttonStateL;<\/p>\n\n\n\n<p>&nbsp; &nbsp; oldStateR = buttonStateR;<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>\/\/ ############################## Check the Buttons for Notes #################################<\/p>\n\n\n\n<p>void Check_DrumButtons() {<\/p>\n\n\n\n<p>&nbsp; \/\/&#8211; Don&#8217;t do anything unless they press a switch &#8212;<\/p>\n\n\n\n<p>&nbsp; if ( bits1 != B11111111 &amp;&amp; oldStatus1 != bits1 ) \/\/ Unless they&#8217;re all high&#8230;<\/p>\n\n\n\n<p>&nbsp; { &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; \/\/&#8211; Find lowest pressed switch &#8212;<\/p>\n\n\n\n<p>&nbsp; &nbsp; for ( byte bitIndex = 0; bitIndex &lt; 8; bitIndex++ )<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if (bitRead(bits1, bitIndex) == 0) {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; if ( oldStateL == HIGH ) {<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if (bitRead(notes1, bitIndex) == 1) {<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bitClear( notes1, bitIndex );&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bitSet( notes1, bitIndex );<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inotes1[curIns] = notes1;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; } else \/\/ Instrument_Select<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; { &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Select_Instr( bitIndex );<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; exit;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; } &nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; if ( bits2 != B11111111&nbsp; &amp;&amp; oldStatus2 != bits2 ) \/\/ Unless they&#8217;re all high&#8230;<\/p>\n\n\n\n<p>&nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; \/\/&#8211; Find lowest pressed switch &#8212;<\/p>\n\n\n\n<p>&nbsp; &nbsp; for (byte bitIndex = 0; bitIndex &lt; 8; bitIndex++)<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if (bitRead(bits2, bitIndex) == 0) {<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; if ( oldStateL == HIGH ) \/\/ &amp;&amp; oldStateS == HIGH )&nbsp; \/\/ Beide Buttons L und S sind nicht gedr\u00fcckt!<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (bitRead(notes2, bitIndex ) == 1) {<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bitClear(notes2, bitIndex );&nbsp;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bitSet( notes2, bitIndex );&nbsp;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inotes2[curIns] = notes2;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ Serial.println (&#8222;Bit Cleared&#8220;);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ }&nbsp;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ ExplosionAnimation(bitIndex, address2);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; } else<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (bitIndex == 0 ) \/\/ left 2 Bits to change the Scale<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( scale &gt; 0 ){ scale = scale-1; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.setCursor(0,0);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.print( Modes[5] + &#8220;&nbsp; &#8220; + scale_string[ scale ] +&#8220;&nbsp; &nbsp; &nbsp; &#8220;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (bitIndex == 1 ) \/\/ left 2 Bits to change the Scale<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { scale = scale+1;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( scale &gt;=4) scale=0; \/\/ only llop through straight scales&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.setCursor(0,0);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.print( Modes[5] + &#8220;&nbsp; &#8220; + scale_string[ scale ] +&#8220;&nbsp; &nbsp; &nbsp; &#8220;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (bitIndex==6 ) \/\/ left 4 Bits to change the Scale<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; old_bpm = bpm;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bpm = bpm &#8211; 2;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (bpm &lt; 40) {bpm=40;}<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.setCursor(0,0);<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.print( Modes[2] + &#8220; &#8220; + String(bpm) +&#8220; bpm &nbsp; &#8220;&nbsp; );<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tempo_delay = 60000000 \/ bpm \/ 24;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (bitIndex==7 ) \/\/ add some speed to BPM<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; old_bpm = bpm;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bpm = bpm + 2;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (bpm &gt; 300) {bpm=300;}<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.setCursor(0,0);<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lcd.print( Modes[2] + &#8220; &#8220; + String(bpm) +&#8220; bpm &nbsp; &#8220;&nbsp; );<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tempo_delay = 60000000 \/ bpm \/ 24;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; exit;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; } &nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; oldStatus1 = bits1;<\/p>\n\n\n\n<p>&nbsp; oldStatus2 = bits2;&nbsp;<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>\/\/ #### Setup Setup Setup Setup Setup Setup Setup Setup Setup Setup Setup Setup Setup Setup Setup Setup Setup Setup Setup #####<\/p>\n\n\n\n<p>void setup() {<\/p>\n\n\n\n<p>&nbsp; pinMode(13, OUTPUT);<\/p>\n\n\n\n<p>&nbsp; lcd.init(); \/\/ initialize the lcd&nbsp;<\/p>\n\n\n\n<p>&nbsp; \/\/ Print a message to the LCD<\/p>\n\n\n\n<p>&nbsp; lcd.backlight(); \/\/ I have not enabled that pin&#8230; at my box, the backlight is always on, via hardwire.<\/p>\n\n\n\n<p>&nbsp; lcd.print(&#8222;hman-Projects.de&#8220;);<\/p>\n\n\n\n<p>&nbsp; count_instr = sizeof(iSound);<\/p>\n\n\n\n<p>&nbsp; Wire.begin(); \/\/ Arduino UNO uses (SDA=A4,SCL=A5)<\/p>\n\n\n\n<p>&nbsp; \/\/ Wire.begin(0,2); \/\/ ESP8266 needs (SDA=GPIO0,SCL=GPIO2)<\/p>\n\n\n\n<p>&nbsp; pinMode(buttonPinS, INPUT); \/\/ Selecct Button<\/p>\n\n\n\n<p>&nbsp; pinMode(buttonPinL, INPUT); \/\/ Left- or Start-Button<\/p>\n\n\n\n<p>&nbsp; pinMode(buttonPinR, INPUT); \/\/ Right- or Stop-Button<\/p>\n\n\n\n<p>&nbsp; \/\/ virtual Pull-Up-Resitor activated, Pins are by default &#8222;HIGH&#8220;<\/p>\n\n\n\n<p>&nbsp; digitalWrite(buttonPinS, HIGH);&nbsp;<\/p>\n\n\n\n<p>&nbsp; digitalWrite(buttonPinL, HIGH);<\/p>\n\n\n\n<p>&nbsp; digitalWrite(buttonPinR, HIGH);<\/p>\n\n\n\n<p>&nbsp; notes1 = B11111111; \/\/ Bitwise per Instrument, No Note equals &#8222;1&#8220;, note to play equals &#8222;0&#8220; !<\/p>\n\n\n\n<p>&nbsp; notes2 = B11111111;<\/p>\n\n\n\n<p>&nbsp; midiA.begin(MIDI_CHANNEL_OMNI);&nbsp; &nbsp; \/\/ Midi-Input for Sync<\/p>\n\n\n\n<p>&nbsp; tempo_delay = 60000000\/bpm\/24; &nbsp; &nbsp; \/\/ delay in Microseconds &#8230;.<\/p>\n\n\n\n<p>&nbsp; Timer1.initialize( tempo_delay );&nbsp; \/\/ initialize timer1, and set a 1\/2 second period<\/p>\n\n\n\n<p>&nbsp; Timer1.attachInterrupt(callback);<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>void Read_Switches() {<\/p>\n\n\n\n<p>&nbsp; &nbsp; bits1 = ReadIo( address1 ); \/\/ Read all switches<\/p>\n\n\n\n<p>&nbsp; &nbsp; bits2 = ReadIo( address2 ); \/\/ Read all switches<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>\/\/ ############################################ void loop #################################################<\/p>\n\n\n\n<p>void loop() {<\/p>\n\n\n\n<p>&nbsp; \/\/ b is a simple Counter to do nothing &nbsp;<\/p>\n\n\n\n<p>&nbsp; b ++;<\/p>\n\n\n\n<p>&nbsp; if (b &gt; 4) \/\/ read the IO-Pins every 5 cycles<\/p>\n\n\n\n<p>&nbsp; {&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; \/\/ Update the LEDs<\/p>\n\n\n\n<p>&nbsp; &nbsp; showStep (step_position, address1, address2, notes1, notes2 );<\/p>\n\n\n\n<p>&nbsp; &nbsp; Check_MENU();<\/p>\n\n\n\n<p>&nbsp; &nbsp; b = 0;<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; myStep ++; \/\/ This is second counter to find the right time to get the new values from the BUTTONS and the POT<\/p>\n\n\n\n<p>&nbsp; if ( myStep &gt;= myRefresh&nbsp; ) {<\/p>\n\n\n\n<p>&nbsp; &nbsp; myStep = 0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; Read_Switches();<\/p>\n\n\n\n<p>&nbsp; &nbsp; Check_POT();<\/p>\n\n\n\n<p>&nbsp; &nbsp; Check_MENU();<\/p>\n\n\n\n<p>&nbsp; &nbsp; Check_DrumButtons();&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; \/\/ lcd.setCursor(0,1);<\/p>\n\n\n\n<p>&nbsp;&nbsp; \/\/&nbsp; lcd.print (&#8222;Step:&#8220; + String(step_position) + &#8220; &#8220; + scale_value[scale] + &#8220; &#8220; + String(scale) + &#8220; &nbsp; &#8220; );<\/p>\n\n\n\n<p>&nbsp; }&nbsp;<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>void callback() \/\/ Callback from Timer1<\/p>\n\n\n\n<p>{&nbsp;<\/p>\n\n\n\n<p>&nbsp; if ( old_bpm != bpm ) {&nbsp; Timer1.initialize(tempo_delay); old_bpm = bpm; }<\/p>\n\n\n\n<p>&nbsp; count_ppqn++; &nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp; if (count_ppqn &gt;= scale_value[scale] )<\/p>\n\n\n\n<p>&nbsp; { &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; step_position++;<\/p>\n\n\n\n<p>&nbsp; &nbsp; if ( step_position &gt;= count_bars ) {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; step_position=0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; Update_Midi();<\/p>\n\n\n\n<p>&nbsp; &nbsp; count_ppqn =0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; digitalWrite(13, digitalRead(13) ^ 1);<\/p>\n\n\n\n<p>&nbsp; }&nbsp; &nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp; \/\/ lcd.setCursor(0,1);<\/p>\n\n\n\n<p>&nbsp; \/\/ lcd.print (&#8222;Step:&#8220; + String(step_position) + &#8220; &#8220; + scale_value[scale] );<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/p>\n\n\n\n<p>\/\/This function is call by the timer depending Sync mode and BPM\/\/<\/p>\n\n\n\n<p>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/p>\n\n\n\n<p>void Count_PPQN(){<\/p>\n\n\n\n<p>\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;Sync SLAVE&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\/\/ &nbsp;<\/p>\n\n\n\n<p>\/*&nbsp; if(midi_sync){<\/p>\n\n\n\n<p>&nbsp; &nbsp; timer_time=5000;<\/p>\n\n\n\n<p>&nbsp; &nbsp; if (midiA.read())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ Is there a MIDI message incoming ?<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; byte data = midiA.getType();<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if(data == midi::Start ){<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; if(playBeats==true) \/\/mode==MODE_PATTERN_PLAY || mode==MODE_PATTERN_WRITE || mode==MODE_INST_SELECT)<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playBeats=true;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ play_pattern = 1;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count_ppqn=-1;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/if(mode==MODE_SONG_PLAY || mode==MODE_SONG_WRITE){<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/&nbsp; play_song = 1;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/&nbsp; count_ppqn=-1;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/&nbsp; song_position=0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; else if(data == midi::Stop ) {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; playBeats=false;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ play_pattern = 0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ play_song = 0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ count_step=0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; step_position=0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; count_ppqn=-1;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ song_position=0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; else if(data == midi::Clock &amp;&amp; playBeats==true) \/\/(play_pattern == 1 || play_song == 1))&nbsp; &nbsp; case midi::Clock<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; count_ppqn++;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; count_step=count_ppqn\/scale_value[scale];<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; if(count_ppqn&gt;=(count_bars * scale_value[scale])-1) {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count_ppqn=-1;&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; step_position++;&nbsp; &nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ song_position++;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ if (song_position==16) song_position=0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( step_position &gt;= count_bars ) { step_position=0; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ Play Notes!!<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Update_Midi();<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ Request news from Drum-Buttons<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Check_DrumButtons();&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ Update the LEDs&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showStep (step_position, address1, address2, notes1, notes2 ); &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ if (count_ppqn&gt;1) led_flag=0;\/\/Led clignote reste ON 1 count sur 6<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ if (count_ppqn&lt;=1) led_flag=1;&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ led_flag=!led_flag; &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/ if (data==MIDI_CLOCK &amp;&amp; (play_pattern == 0 || play_song==0)){<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/&nbsp; count_led++;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/&nbsp; if(count_led==12){<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/&nbsp; &nbsp; count_led=0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/&nbsp; &nbsp; led_flag=!led_flag;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/&nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/}<\/p>\n\n\n\n<p>&nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; \/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;Sync MASTER&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\/\/<\/p>\n\n\n\n<p>&nbsp; if(!midi_sync){<\/p>\n\n\n\n<p>&nbsp; *\/<\/p>\n\n\n\n<p>&nbsp; &nbsp; \/\/ timer_time=2500000\/bpm;<\/p>\n\n\n\n<p>&nbsp; &nbsp; \/\/ midiA(MIDI_CLOCK);<\/p>\n\n\n\n<p>&nbsp;&nbsp; &nbsp; digitalWrite(13, digitalRead(13) ^ 1);<\/p>\n\n\n\n<p>&nbsp; &nbsp; \/*&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; lcd.setCursor(0,1);<\/p>\n\n\n\n<p>&nbsp; &nbsp; lcd.print( &#8220; Timer&#8220; + String( count_ppqn ) );&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; \/\/ midiA.sendRealTime(MIDI_NAMESPACE::Clock);<\/p>\n\n\n\n<p>&nbsp; &nbsp; if( playBeats==true ) \/\/play_pattern||play_song)<\/p>\n\n\n\n<p>&nbsp; &nbsp; {&nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; count_ppqn++; &nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; count_step=count_ppqn\/scale_value[scale];&nbsp; &nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; if(count_ppqn&gt;=(count_bars*scale_value[scale])-1){<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; count_ppqn=-1;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; step_position++;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ if (song_position==16) song_position=0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; if ( step_position&gt;= count_bars ) { step_position=0; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Play Notes<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; Update_Midi();<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; Check_DrumButtons();&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Update the LEDs&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; showStep (step_position, address1, address2, notes1, notes2 );<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/ if (count_ppqn&gt;1) led_flag=0;\/\/Led blink 1 count on 6<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/ if (count_ppqn&lt;=1) led_flag=1;&nbsp;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/ led_flag=!led_flag;<\/p>\n\n\n\n<p>&nbsp; &nbsp; }<\/p>\n\n\n\n<p>&nbsp; &nbsp; else if(playBeats==false) \/\/ !play_pattern &amp;&amp;!play_song)<\/p>\n\n\n\n<p>&nbsp; &nbsp; {<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; count_ppqn=-1;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; step_position=0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/ count_led++;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/ song_position=0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/ if(count_led==12){<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/&nbsp; count_led=0;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/&nbsp; led_flag=!led_flag;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; \/\/ }<\/p>\n\n\n\n<p>&nbsp; &nbsp; }<\/p>\n\n\n\n<p>\/\/ &nbsp; }<\/p>\n\n\n\n<p>*\/<\/p>\n\n\n\n<p>}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Based on a Arduino, I had build a 16 Step Drum Sequencer which triggers Drum-Sounds via MIDI. To use 3 PCF 8475 ICs was inspired by this Video: My Code is not really ready to\u00a0all things in the menu, but perhaps &#8211; it could be a good starting-point for Your next project. This code here [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[4,38],"class_list":["post-372","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-arduino","tag-diy"],"_links":{"self":[{"href":"https:\/\/www.hman-projects.de\/index.php?rest_route=\/wp\/v2\/posts\/372"}],"collection":[{"href":"https:\/\/www.hman-projects.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hman-projects.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hman-projects.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hman-projects.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=372"}],"version-history":[{"count":1,"href":"https:\/\/www.hman-projects.de\/index.php?rest_route=\/wp\/v2\/posts\/372\/revisions"}],"predecessor-version":[{"id":373,"href":"https:\/\/www.hman-projects.de\/index.php?rest_route=\/wp\/v2\/posts\/372\/revisions\/373"}],"wp:attachment":[{"href":"https:\/\/www.hman-projects.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hman-projects.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hman-projects.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}