{"id":265,"date":"2017-12-12T23:45:18","date_gmt":"2017-12-12T22:45:18","guid":{"rendered":"http:\/\/www.hman-projects.de\/?p=265"},"modified":"2018-01-27T15:29:18","modified_gmt":"2018-01-27T14:29:18","slug":"esp8266-stompbox-horsekick-oder-finhol-oder-spdkick-nachbau","status":"publish","type":"post","link":"http:\/\/www.hman-projects.de\/?p=265","title":{"rendered":"ESP8266 Stompbox ( Horsekick oder Finhol oder SPD::KICK ) Nachbau"},"content":{"rendered":"<p>Als Gitarrist und Elektroniker will man doch mal den Beat mittrampeln. Also hatte ich mir schon einige Projekte im Web angeschaut und dann Ende Oktober eine Audio-Library zum ESP8266 gefunden. Alternativen nur mit einem Piezo oder MIkrofon in einer Pappschachtel sollen auch funktionieren, &#8211; gefielen mir aber nicht.<br \/>\nEin ESP8266-Development-Board gibt es f\u00fcr unter 10 \u20ac, der Adafruit DAC mit 3 Watt Amp hatte ich schon gekauft, &#8211; liegt auch bei 10 \u20ac.<br \/>\nDas OLED-Display, weitere Kleinteile wie Piezo, Taster und ein paar kleine Bauteile machen nochmal 15\u20ac. Das Holzgeh\u00e4use\u00a0 bauen, bearbeiten und die Auswahl der Sounds dauert auch\u00a0 l\u00e4nger. Als Powersupply dient eine \u00e4ltere USB-Powerbank.<br \/>\nWenn man alle Teile extra kaufen muss, dann rechnet sich das Projekt auf Grund von den Kosten und dem Aufwand aus meiner Sicht <span style=\"text-decoration: underline;\">nicht<\/span>. Ich hatte aber alle Teile herumliegen und wollte es einfach mal ausprobieren.<\/p>\n<p>So sah die erste Version aus, die dann aber sp\u00e4ter in 2 Teile durchgetrennt wurde. Somit konnten dann die Bewegungen der Ferse und somit die Ger\u00e4usche und Fehltrigger minimiert werden.<br \/>\nDie Basis bildet ein 3-Schicht Holz ca. 28 x 14cm. Unter der Unterlegscheibe befindet sich ein Hohlraum f\u00fcr den ESP8266 und den Piezo. Das OLED-Display ist leicht versetzt eingebaut. Rechts bzw. hier dann oben befindet sich in einer Einbuchtung ein Taster zur Soundwahl und links in der gegen\u00fcberliegenden Einbuchtung die Klinkenbuchse.<\/p>\n<p><a href=\"http:\/\/www.hman-projects.de\/wp-content\/uploads\/2017\/12\/IMG_1015.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-278 size-large\" src=\"http:\/\/www.hman-projects.de\/wp-content\/uploads\/2017\/12\/IMG_1015-1024x768.jpg\" alt=\"Hman-Stompbox\" width=\"720\" height=\"540\" srcset=\"http:\/\/www.hman-projects.de\/wp-content\/uploads\/2017\/12\/IMG_1015-1024x768.jpg 1024w, http:\/\/www.hman-projects.de\/wp-content\/uploads\/2017\/12\/IMG_1015-300x225.jpg 300w\" sizes=\"(max-width: 720px) 100vw, 720px\" \/><\/a><\/p>\n<p>Halbfertige Alternativen zum ESP8266 k\u00f6nnten auch Raspi-Projekte wie Samplerbox oder fertige Platinen wie Wavetrigger von Robertronics sein. Beide bieten aber keinen Anschluss eines Piezos!<br \/>\nRaspi-Projekte k\u00f6nnten final noch teurer werden, denn der Zeitaufwand zur Einrichtung von Linux k\u00f6nnte gr\u00f6\u00dfer ausfallen.<\/p>\n<p>Als fertige L\u00f6sung gefiel mir das Ortega Horsekick Pro\u00a0 ca. 170\u20ac und vom Datenblatt und den Sounds her das Roland Boss SDP::Kick oder SDP::Wave f\u00fcr \u00fcber 200\u20ac.<\/p>\n<p>Zur\u00fcck zum &#8222;selbermachen&#8220;.<\/p>\n<p>Zur Ausgabe der Sounds verwende ich die\u00a0fertige Audio-Library von Earle F. Philhower, III<br \/>\n<a href=\"https:\/\/github.com\/earlephilhower\/ESP8266Audio\" target=\"_blank\">https:\/\/github.com\/earlephilhower\/ESP8266Audio<\/a><\/p>\n<p>Das ZIP muss entpackt werden und dann nach \/Arduino\/libraries\/ verschoben werden.<\/p>\n<p>Die Anschaltung des DACs and den ESP8266 erfolgte wie in <a href=\"https:\/\/github.com\/bbx10\/SFX-web-trigger\" target=\"_blank\">https:\/\/github.com\/bbx10\/SFX-web-trigger<\/a>. Der DAC ist das\u00a0&#8222;Adafruit I2S 3W Class D Amplifier Breakout &#8211; MAX98357A&#8220;.<\/p>\n<p>Der Lautsprecher-Ausgang des DAC geht bei mir auf die beiden \u00e4u\u00dferen Enden eines 50kOhm-Trimmer, an dem dann der Mittelpin eines 6.3mm Klinkenbuchse \u00fcber einen weiteren Widerstand h\u00e4ngt. Die Masse der Buchse ist auf einen &#8222;Aussenpin&#8220; des Trimmers gelegt. Nachtr\u00e4glich habe ich zwischen den Mittelabgriff des Trimmer und &#8222;+&#8220; der Klinkenbuchse noch einen Widerstand eingebaut &#8230; ca. 10kOhm und einen Kondensator zur Entkopplung von Gleichspannungen, &#8211; also in Reihe mit dem Widerstand.<\/p>\n<p>Nach dem Zusammenbau von DAC, ESP8266, einigen Kondensatoren zur Spannungsstabilisierung und dem PIEZO fehlte nur noch die Abstimmung der Empfindlichkeit, denn der Beat soll sowohl mit sehr festen Fu\u00dfwerk als auch Sportschuhen oder auch ohne Schuhe nur mit Socken funktionieren.<\/p>\n<p>Nach zwei frustrierenden Abenden mit Tests verschiedener Einstellungen hatte ich dann ein einfaches Testscript gefunden und dieses funktionierte auf Anhieb ausreichend gut. Es\u00a0 bildet nun die Grundlage f\u00fcr das eigene Stompbox-Script. Statt einen MIDI-Sound zu triggern, wird ein Sample aus dem &#8222;ProgMem&#8220; des ESP8266 ausgegeben.<\/p>\n<p>Vorlage f\u00fcr das Testscript:<\/p>\n<p><a href=\"https:\/\/github.com\/RyoKosaka\/drums\/blob\/master\/arduino\/piezo_peak_test_MIDI\/piezo_peak_test_MIDI.ino\" target=\"_blank\">https:\/\/github.com\/RyoKosaka\/drums\/blob\/master\/arduino\/piezo_peak_test_MIDI\/piezo_peak_test_MIDI.ino<\/a><\/p>\n<p>Die Samples, die im &#8222;ProgMem&#8220; abgelegt werden, sollten unterschiedlich sein, so dass ich bei den n\u00e4chsten Sessions die besten Sounds ausw\u00e4hlen und die &#8222;schlechten&#8220; gegen andere tauschen kann.<br \/>\nAlso habe ich in meiner Sample-Sammlung und Synths nach Percussion und Kickdrum-Samples gesucht. Diese gek\u00fcrzt, auf Mono und 16 Bit gesetzt, &#8211; 44.1kHz.<\/p>\n<p>Earle Philhower erkl\u00e4rt ausreichend gut, wie man die 16Bit-Wav-Files einfach in HEX-Files konvertrieren kann, um sie in seinen Libraries als &#8222;Audio-Source-ProgMem&#8220; zu verwenden. Ich hatte dazu aber eine eigene Javascript-Webpage gebaut, die mir die Sounds in h-Files convertiert. Die WAV-Files m\u00fcssen als HEX-Files vorliegen.<br \/>\nDie Sound-hex-Files sehen dann etwas so aus:<\/p>\n<pre>const unsigned char cajonbass[] PROGMEM = {0x52,0x49,0x46,0x46,0x1a,0x6c,0x00,0x00,0x57,0x41,0x56,0x45,0x66,0x6d,0x74,0x20\r\n,0x10,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x44,0xac,0x00,0x00,0x88,0x58,0x01,0x00....\r\n};<\/pre>\n<p>Ein OLED128x64Pixel (gr\u00fcne Fahne) (von Amazon) wurde an den ESP8266-Pins &#8222;D1&#8220; \/ &#8222;D2&#8220; angeschaltet., an &#8222;D3&#8220; liegt ein Taster, wenn er geschlossen ist, zieht er den Pin D3 dann gegen Masse um die Sounds zu wechseln.<\/p>\n<p>Final passen 1 MByte in das System. Ich konnte damit ca. 20 sehr kurze Sounds laden.<\/p>\n<p>Die Library f\u00fcr das OLED-Display:<br \/>\nhttps:\/\/github.com\/squix78\/esp8266-oled-ssd1306<br \/>\nDiese wird aber innerhalb der Arduino IDE zur Installation angeboten und nennt sich dort:<br \/>\n&#8222;ESP8266 and ESP32 OLED Driver for SSD1306 Display by Daniel Eichhorn, Fabrive Weinberg..:&#8220;<\/p>\n<p>Ursp\u00fcnglich war statt des Tasters ein Rotary Encoder und ein kompelexeres Men\u00fc geplant. Auch die Darstellung von kleinen Icons zu den Instrumenten habe ich wieder verworfen, denn diese verbrauchten auch zus\u00e4tzlichen RAM.<\/p>\n<p>Eine Idee w\u00e4re die Auslagerung der Samples in externen Storage.<br \/>\nDie Umwandlung der Samples in andere komprimierte Formate w\u00fcrden zus\u00e4tzliche Zeit zur Dekodierung und somit zu Latenzen beim Triggern f\u00fchren.<\/p>\n<p>Das Holzgeh\u00e4use besteht nun aus 2 Teilen, einem Teil mit der Elektronik und dem Piezo und einem St\u00fcck Holz. Beide Teile sind miteinander \u00fcber Gummist\u00fccke verbunden und ergeben die Auflagefl\u00e4che f\u00fcr einen Fu\u00df. Der passive Teil liegt unter der Ferse und der aktive Teil mit dem Piezo kann sicher mit dem Fu\u00df getrigggert werden.<\/p>\n<p>Unten drunter gibt es jeweils Gummif\u00fc\u00dfe gegen das Verrutschen. (Bilder folgen)<br \/>\nIn einer ersten Version hatte ich nur eine gro\u00dfe Holzplatte\u00a0 eingeplant, musste diese Version aber verwerfen, denn schon die Bewegung des Fu\u00dfes auf der Platte sorgte f\u00fcr Fehltrigger oder Doppeltrigger beim Runtertreten und beim Abheben des Fu\u00dfes.<\/p>\n<p>Technisch machen es sich die Hersteller einfach und liefern nur das aktive Teil, auf das man treten soll. Ergonomisch ist das aber nicht, denn man muss zum niedertreten den Fu\u00df weit anheben.<\/p>\n<p>Hier das vorl\u00e4ufige Arduino-Script:<\/p>\n<pre>#include &lt;Arduino.h&gt;\r\n#include &lt;ESP8266WiFi.h&gt;\r\n#include \"AudioFileSourcePROGMEM.h\"\r\n#include \"AudioGeneratorWAV.h\"\r\n#include \"AudioOutputI2SDAC.h\"\r\n\r\n#include &lt;Wire.h&gt; \u00a0\r\n#include \"SSD1306.h\"\r\n\r\n\/\/ WAV-Files\r\n\/\/ WAV-Files, MONO 44.1 KBIT\/s 16Bit\r\n#include \"fatbass.h\"\r\n#include \"softkick.h\"\r\n#include \"espkik03.h\"\r\n\/\/ #include \"espkik04.h\"\r\n#include \"cajonbass.h\"\r\n#include \"espkik06.h\"\r\n#include \"espkik07.h\"\r\n#include \"espkik08.h\"\r\n#include \"espkik09.h\"\r\n#include \"espkik10.h\"\r\n#include \"espkik11.h\"\r\n#include \"espkik12.h\"\r\n#include \"espkik13.h\"\r\n#include \"espkik14.h\"\r\n#include \"espkik15.h\"\r\n\/\/ #include \"espkik16.h\"\r\n#include \"espkik17.h\"\r\n#include \"espkik18.h\"\r\n#include \"espkik19.h\"\r\n#include \"espkik20.h\" \r\n#include \"espkik22.h\"\r\n#include \"ride1.h\"\r\n\/\/ #include \"espkik28.h\"\r\n\r\nAudioGeneratorWAV *wav;\r\nAudioFileSourcePROGMEM *file;\r\nAudioOutputI2SDAC *out;\r\n\r\nunsigned short buttonState = 0; \/\/ Selectbutton for the sounds\r\nunsigned short oldButtonState = 1;\r\nboolean piezo = false;\r\nint maxPiezo = 400;\r\nint gaindevider = 380;\r\n\r\nunsigned short s = 0;\r\nunsigned short s_old = 20; \/\/ Sample-ID\r\n\r\n\r\nconst char *samplenames1[] ={\"0 Fat\",\r\n\u00a0\u00a0\u00a0\u00a0 \" 1 Soft\u00a0\u00a0\u00a0 \" , \" 2 Cajon\u00a0 \"\r\n\u00a0\u00a0 , \" 3 Rock\u00a0\u00a0 \" , \" 4 Ride\u00a0 \"\r\n\u00a0\u00a0 , \" 5 Cajon\u00a0 \" , \" 6 Arabic\"\r\n\u00a0\u00a0 , \" 7 Acoust \" , \" 8 Acoust\"\r\n\u00a0\u00a0 , \" 9 R908\u00a0\u00a0 \" , \"10 R809\u00a0 \"\r\n\u00a0 \u00a0\r\n\u00a0\u00a0 , \"11 Tambo- \", \"12 Christ.\"\r\n\u00a0\u00a0 , \"13 Cabasa \", \"14 Guiro\u00a0 \"\r\n\u00a0\u00a0 , \"15 Rattle \", \"16 Rattle\",\r\n\u00a0\u00a0 , \"16 Cow\u00a0\u00a0\u00a0 \", \"17 Claves \"\r\n\u00a0\u00a0 , \"18 Clap\u00a0\u00a0 \", \"19 Side\u00a0\u00a0 \"\r\n\u00a0\u00a0 , \"20 Hihat\u00a0 \", \"21 Ride\u00a0\u00a0 \"\r\n\u00a0 \u00a0\r\n\u00a0 };\r\n\r\nconst char *samplenames2[] ={\"Drum\",\r\n\u00a0\u00a0\u00a0\u00a0 \"\u00a0\u00a0\u00a0 Kick\",\u00a0 \"\u00a0\u00a0\u00a0 Bass\"\r\n\u00a0\u00a0 , \"\u00a0\u00a0\u00a0 Kick\",\u00a0 \"\u00a0\u00a0\u00a0 Cymbal\"\r\n\u00a0\u00a0 , \"\u00a0\u00a0\u00a0 Bass\",\u00a0 \"\u00a0\u00a0\u00a0 Bass\"\r\n\u00a0\u00a0 , \"\u00a0\u00a0\u00a0 Stomp\", \"\u00a0\u00a0\u00a0 Stomp\"\r\n\u00a0\u00a0 , \"\u00a0\u00a0\u00a0 Synth\", \"\u00a0\u00a0\u00a0 Synth\"\r\n\u00a0\u00a0 , \"\u00a0\u00a0\u00a0 Latin\",  \"    Latin\"\r\n\u00a0\u00a0 , \"rine Man\",\u00a0 \"\u00a0\u00a0\u00a0 Bells\"\r\n\u00a0\u00a0 , \"\u00a0\u00a0\u00a0 Latin\", \"\u00a0\u00a0\u00a0 Latin\" \r\n\r\n\u00a0\u00a0 , \"\u00a0\u00a0\u00a0 Bell\",\u00a0 \"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"\r\n\u00a0\u00a0 , \"\u00a0\u00a0\u00a0 Clap\",\u00a0 \"\u00a0\u00a0\u00a0 Stick\"\r\n\u00a0\u00a0 , \"\u00a0\u00a0 Closed\",\"\u00a0\u00a0\u00a0 Cymbal\"\r\n\r\n\u00a0 }; \u00a0\r\n\r\n\r\nunsigned short samplecount = 21; \/\/ Anzahl der Samples f\u00fcr den Select-Button\r\nSSD1306\u00a0 display(0x3c, 5, 4); \/\/Labeled D1, D2\r\nconst int buttonPin = 0; \/\/ Labeled D3, Pin is high by default, button between this pin and GND to switch the sounds\r\n\r\n\r\nvoid setup() {\r\n\u00a0 WiFi.forceSleepBegin();\r\n\u00a0 display.init();\r\n\u00a0 \/\/ display.flipScreenVertically();\r\n\u00a0 display.setContrast(255);\r\n\r\n\u00a0 display.setTextAlignment(TEXT_ALIGN_LEFT);\r\n\u00a0 display.setFont(ArialMT_Plain_24);\r\n\u00a0 display.drawStringMaxWidth(0 , 0 , 128, \" Heinemann\");\r\n\u00a0 display.drawStringMaxWidth(0 , 24 , 128,\"\u00a0 Stomper\");\r\n\u00a0 \/\/ display.drawXbm(20, 30, bassdrum_width, bassdrum_height, bassdrum_bits);\r\n\u00a0 display.display();\r\n\r\n\u00a0 \r\n\u00a0 \/\/ pinMode(BUILTIN_LED, OUTPUT);\r\n\u00a0 Serial.begin(115200);\r\n\u00a0 delay(3000);\r\n\u00a0 \r\n\u00a0 file = new AudioFileSourcePROGMEM( fatbass, sizeof(fatbass) ); \/\/ Short Demosound after Booting\r\n\u00a0 out = new AudioOutputI2SDAC();\r\n\u00a0 out-&gt;SetGain(0.02);\r\n\u00a0 wav = new AudioGeneratorWAV();\r\n\u00a0 wav-&gt;begin(file, out);\r\n\u00a0 \r\n\u00a0 pinMode( buttonPin, INPUT); \/\/ GPIO 0 == D03 on ESP8266 !!\r\n\r\n}\r\n\r\n\r\nvoid loop() {\r\n\u00a0 \r\n\u00a0 if ( s != s_old ) {\r\n\u00a0\u00a0\u00a0 if (s &gt;= samplecount) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 s=1;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 s_old = s;\r\n\u00a0\u00a0\u00a0 display.clear();\r\n\u00a0\u00a0\u00a0 display.setTextAlignment(TEXT_ALIGN_LEFT);\r\n\u00a0\u00a0\u00a0 display.setFont(ArialMT_Plain_24);\r\n\u00a0\u00a0\u00a0 display.drawStringMaxWidth(0 , 0 , 128, samplenames1[s]);\r\n\u00a0\u00a0\u00a0 display.drawStringMaxWidth(0 , 24 , 128, samplenames2[s] ); \/\/ + (String) s);\r\n\u00a0\u00a0\u00a0 display.display();\r\n\u00a0 } \r\n\u00a0 \r\n\u00a0 int sensorValue = analogRead(A0);\r\n\u00a0 int MAX;\r\n\r\n\u00a0 if (sensorValue &gt; 20 &amp;&amp;\u00a0 piezo == false) {\r\n\u00a0\u00a0\u00a0 int peak1 = analogRead(A0);\r\n\u00a0\u00a0\u00a0 MAX = peak1;\r\n\u00a0\u00a0\u00a0 delay(1);\r\n\u00a0\u00a0\u00a0 int peak2 = analogRead(A0);\r\n\u00a0\u00a0\u00a0 if (peak2 &gt; MAX) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 MAX = peak2;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 \/\/ delay(1); \/\/ absichtlich deaktiviert!!\r\n\u00a0\u00a0\u00a0 int peak3 = analogRead(A0);\r\n\u00a0\u00a0\u00a0 if (peak3 &gt; MAX) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 MAX = peak3;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 delay(1);\r\n\u00a0\u00a0\u00a0 int peak4 = analogRead(A0);\r\n\u00a0\u00a0\u00a0 if (peak4 &gt; MAX) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 MAX = peak4;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 delay(1);\r\n\u00a0\u00a0\u00a0 int peak5 = analogRead(A0);\r\n\u00a0\u00a0\u00a0 if (peak5 &gt; MAX) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 MAX = peak5;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 \/\/ delay(1); \/\/ absichtlich deaktiviert !!\r\n\u00a0\u00a0\u00a0 int peak6 = analogRead(A0);\r\n\u00a0\u00a0\u00a0 if (peak6 &gt; MAX) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 MAX = peak6;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 if(MAX &gt;= maxPiezo){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 MAX = maxPiezo;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\/\/\u00a0\u00a0\u00a0\u00a0 MAX = map(MAX, 10, maxPiezo, 1, 127); \/\/ entfaellt bei mir\r\n\r\n\u00a0\u00a0\u00a0 if(MAX &lt;= 1){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 MAX = 1;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 midiNoteOn( MAX );\r\n\u00a0\u00a0\u00a0 Serial.println( MAX);\r\n\u00a0\u00a0\u00a0 piezo = true;\r\n\r\n\u00a0\u00a0\u00a0 \/\/ teh next block could be replaced by delay(30); or anything similar...\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0);\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0\u00a0\u00a0 Serial.println( 0 );\r\n\u00a0\u00a0\u00a0 delay(1); \/\/mask time\r\n\u00a0 }\r\n\u00a0 if (sensorValue &lt;= 0 &amp;&amp; piezo == true) {\r\n\u00a0\u00a0\u00a0 piezo = false;\r\n\u00a0 }\r\n\r\n\u00a0 \r\n\u00a0 buttonState = digitalRead(buttonPin);\r\n\u00a0 if ( buttonState == LOW &amp;&amp;\u00a0 oldButtonState == HIGH ) {\r\n\u00a0\u00a0\u00a0 oldButtonState = buttonState; \u00a0\r\n\u00a0\u00a0\u00a0 s = s +1;\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 oldButtonState = buttonState; \u00a0\r\n\u00a0\u00a0\u00a0 delay(50); \/\/ debounce\r\n\u00a0 } else {\r\n\u00a0\u00a0\u00a0 oldButtonState = buttonState; \u00a0\r\n\u00a0 }\r\n\r\n\u00a0 if (wav-&gt;isRunning()) {\r\n\u00a0\u00a0\u00a0 if (!wav-&gt;loop()) { \r\n\u00a0\u00a0\u00a0\u00a0\u00a0 wav-&gt;stop(); \/\/ wenn nicht mehr richtig looped dann stoppen\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0 } \u00a0\r\n}\r\n\r\nvoid midiNoteOn( int midiVelocity){\r\n\u00a0 if (midiVelocity &gt; 0) {\r\n\u00a0 switch (s) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 0:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( fatbass, sizeof(fatbass) ); \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 1:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( softkick, sizeof(softkick) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 2:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( softkick, sizeof(softkick) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 3:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik03, sizeof(espkik03) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case 4:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( ride1, sizeof(ride1) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 5:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( cajonbass, sizeof(cajonbass) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 6:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik06, sizeof(espkik06) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 7:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik07, sizeof(espkik07) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 8:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik08, sizeof(espkik08) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 9:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik09, sizeof(espkik09) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 10:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik10, sizeof(espkik10) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 11:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik11, sizeof(espkik11) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 12:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik12, sizeof(espkik12) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 13:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik13, sizeof(espkik13) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 14:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik14, sizeof(espkik14) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 15:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik15, sizeof(espkik15) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0 case 16: \/\/ the same as 15\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik15, sizeof(espkik15) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case 17:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik17, sizeof(espkik17) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 18:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik18, sizeof(espkik18) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 19:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik19, sizeof(espkik19) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 20:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik20, sizeof(espkik20) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 case 21:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( espkik22, sizeof(espkik22) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 default:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file = new AudioFileSourcePROGMEM( fatbass, sizeof(fatbass) ); \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s = 1; \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 \/\/ file = new AudioFileSourcePROGMEM(\u00a0 );\r\n\u00a0\u00a0\u00a0 \/\/ out = new AudioOutputI2SDAC();\r\n\r\n\u00a0\u00a0\u00a0 \/\/ eigentlich p statt oldPiezoVal\r\n\u00a0\u00a0\u00a0 out-&gt;SetGain( 0.05 +\u00a0 (float) midiVelocity\/gaindevider ); \/\/ 0.8(float) p\/130\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 if (wav-&gt;isRunning()) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 wav-&gt;stop(); \/\/ wenn nicht mehr richtig looped dann stoppen\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 wav-&gt;begin(file, out);\r\n\u00a0 }\r\n}<\/pre>\n<p>Die lange Kette von Seriel.println ist ganz praktisch um die Ausgabe per Serial-Plotter zu erm\u00f6glichen. Die Sounds hatte ich Anfangs nur durchnumeriert, werde das aber \u00e4ndern und sprechende Namen verwenden.<\/p>\n<p>Die hex-files liegen im Ardino-Projektordner und nicht in Unterverzeichnissen. Man muss hier auch keinen Tricks zum Upload der Files anwenden.<\/p>\n<p>Mit der Fuktion &#8222;out-&gt;SetGain und der Variablen &#8222;gaindevider&#8220; kann man experimentieren und somit die &#8222;Velocity&#8220; oder Anschlagempfindlichkeit ver\u00e4ndern.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Als Gitarrist und Elektroniker will man doch mal den Beat mittrampeln. Also hatte ich mir schon einige Projekte im Web angeschaut und dann Ende Oktober eine Audio-Library zum ESP8266 gefunden. Alternativen nur mit einem Piezo oder MIkrofon in einer Pappschachtel sollen auch funktionieren, &#8211; gefielen mir aber nicht. Ein ESP8266-Development-Board gibt es f\u00fcr unter 10 [&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,33,32],"class_list":["post-265","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-arduino","tag-arduino-drum","tag-stompbox"],"_links":{"self":[{"href":"http:\/\/www.hman-projects.de\/index.php?rest_route=\/wp\/v2\/posts\/265"}],"collection":[{"href":"http:\/\/www.hman-projects.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.hman-projects.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.hman-projects.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.hman-projects.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=265"}],"version-history":[{"count":13,"href":"http:\/\/www.hman-projects.de\/index.php?rest_route=\/wp\/v2\/posts\/265\/revisions"}],"predecessor-version":[{"id":284,"href":"http:\/\/www.hman-projects.de\/index.php?rest_route=\/wp\/v2\/posts\/265\/revisions\/284"}],"wp:attachment":[{"href":"http:\/\/www.hman-projects.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=265"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.hman-projects.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=265"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.hman-projects.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}