{"id":1853,"date":"2020-09-24T11:17:12","date_gmt":"2020-09-24T09:17:12","guid":{"rendered":"https:\/\/www.pschatzmann.ch\/home\/?p=1853"},"modified":"2021-12-25T15:20:59","modified_gmt":"2021-12-25T14:20:59","slug":"the-synthesis-toolkit-skt-library-for-the-arduino-esp32","status":"publish","type":"post","link":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/","title":{"rendered":"The Synthesis ToolKit (STK) Library for the Arduino ESP32 &#8211; An Introduction"},"content":{"rendered":"<p>I made the <strong><a href=\"https:\/\/ccrma.stanford.edu\/software\/stk\/fundamentals.html\">Synthesis ToolKit (SKT)<\/a><\/strong> available as <a href=\"https:\/\/github.com\/pschatzmann\/Arduino-STK\"><strong>Arduino Library<\/strong><\/a>.<\/p>\n<p>The Synthesis ToolKit in C++ (STK) is a set of open source audio signal processing and algorithmic synthesis classes written in the C++ programming language. STK was designed to facilitate rapid development of music synthesis and audio processing software, with an emphasis on cross-platform functionality, realtime control, ease of use, and educational example code.<\/p>\n<p>The information below is based on the original <a href=\"https:\/\/ccrma.stanford.edu\/software\/stk\/\">STK tutorial<\/a> but was adapted to cover my extensions for the Arduino environment.<\/p>\n<h2>Introduction<\/h2>\n<p>Audio and control signals throughout STK use a floating-point data type, StkFloat, the exact precision of which can be controlled via a typedef statement in Stk.h. By default, an StkFloat is a double-precision floating-point value. Thus, the ToolKit can use any normalization scheme desired. The base instruments and algorithms are implemented with a general audio sample dynamic maximum of +\/-1.0.<\/p>\n<p>In general, the computation and\/or passing of values is performed on a &#8220;single-sample&#8221; basis. For example, the stk::Noise class outputs random floating-point numbers in the range +\/-1.0. The computation of such values occurs in the stk::Noise::tick() function. The following program will generate 20 random floating-point (StkFloat) values in the range -1.0 to +1.0:<\/p>\n<pre><code>#include \"Noise.h\"\nusing namespace stk;\n\nvoid setup() {\n  Serial.begin(115200);\n  StkFloat output;\n  Noise noise;\n  for ( unsigned int i=0; i&lt;20; i++ ) {\n    output = noise.tick();\n    Serial.println(output);\n  }\n}\n\nvoid loop() {\n}\n\n<\/code><\/pre>\n<p>Here is the result in the Arduino Serial Plotter:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-24-at-11.14.37-300x167.png\" alt=\"\" width=\"600\" height=\"300\" class=\"alignnone size-medium wp-image-1854\" \/><\/p>\n<p>Nearly all STK classes implement tick() functions that take and\/or return sample values. Within the tick() function, the fundamental sample calculations are performed for a given class. Most STK classes consume\/generate a single sample per operation and their tick() method takes\/returns each sample &#8220;by value&#8221;. In addition, every class implementing a tick() function also provides one or more overloaded tick() functions that can be used for vectorized computations, as shown in the next example.<\/p>\n<pre><code>#include \"Noise.h\"\nusing namespace stk;\n\nNoise noise;\nStkFrames output(20, 1);   \/\/ initialize StkFrames to 20 frames and 1 channel (default: interleaved)\n\nvoid setup() {\n  Serial.begin(115200);\n}\n\nvoid loop() {\n  noise.tick( output );\n  for ( unsigned int i=0; i&lt;output.size(); i++ ) {\n    Serial.println(output[i]);\n  }\n}\n<\/code><\/pre>\n<p>The generated output is the same as in the first example.<\/p>\n<h2>Hello Sine! (Input to Output)<\/h2>\n<p>We&#8217;ll continue our introduction to the Synthesis ToolKit with a simple sine-wave oscillator program. STK provides two different classes for sine-wave generation. In STK it is quite common to send the output to a file. In Arduino however we rarely have any file system available but we need usually write output to serial. Here is how it can be done:<\/p>\n<pre><code><br \/>#include \"SineWave.h\"\n#include \"ArdStreamOut.h\"\n\nusing namespace stk;\n\nSineWave input;\nArdStreamOut output(Serial);\n\nvoid setup() {\n  Serial.begin(115200);\n\n  Stk::setSampleRate( 44100.0 );\n  input.setFrequency( 440.0 );\n}\n\nvoid loop() {\n  output.tick( input.tick() );\n}\n\n<\/code><\/pre>\n<p>We just copy the input to the output which is Serial in this case. And the output in the Arduino Plotter looks as follows:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-24-at-11.36.44-300x205.png\" alt=\"\" width=\"600\" height=\"300\" class=\"alignnone size-medium wp-image-1857\" \/><\/p>\n<p>The ArdStreamOut is expecting a stream. This is quite powerful if you consider that Arduino provides different implementations of Streams!<\/p>\n<p>The following Arduino specific classes are provided:<\/p>\n<ul>\n<li>ArdStreamOut (Output as string to Stream)<\/li>\n<li>ArdI2SOut (Output to I2S pins or internal DAC)<\/li>\n<li>ArdStreamBinaryOut (Output as binary data to Stream)<\/li>\n<li>ArdStreamHexOut (Output as data converted to hex to Stream)<\/li>\n<\/ul>\n<h2>Sending data over the network<\/h2>\n<p>The example from above can easily be extended to send the data over the network instead of just to the serial port:<\/p>\n<pre><code>#include \"SineWave.h\"\n#include \"ArdStreamOut.h\"\n#include \"WiFi.h\" \/\/ ESP32 WiFi include\n#include \"ArdUdp.h\" \n\nusing namespace stk;\n\nSineWave input;\nIPAddress ip(192, 168, 1, 35);\nArdUdp udp(ip, 7000);\nArdStreamBinaryOut output(udp);\nconst char *SSID = \"your ssid\";\nconst char *PWD = \"your password\";\n\n\nvoid setup() {\n  Serial.begin(115200);\n  WiFi.begin(SSID, PWD);\n  while (WiFi.status() != WL_CONNECTED) {\n    Serial.print('.');\n  }\n\n  Serial.print(\"Connected to IP address: \");\n  Serial.println(WiFi.localIP());\n\n  Stk::setSampleRate( 44100.0 );\n  input.setFrequency( 440.0 );\n}\n\nvoid loop() {\n  output.tick( input.tick() );\n}\n<\/code><\/pre>\n<p>I am using here <strong>ArdStreamBinaryOut<\/strong> because I would like to send the data as is and not as text. We provide the <strong>ArdUdp<\/strong> class which is just a simple wrapper over the Arduino WiFiUDP class. It is sending all output to the same destination &#8211; which is indicated in the constructor. As far as TCP is concerned we can directly use the standard Arduino classes<\/p>\n<h2>Instruments<\/h2>\n<p>The ToolKit comes with a wide variety of synthesis algorithms, all of which inherit from the <strong>stk::Instrmnt<\/strong> class. In this example, we&#8217;ll fire up an instance of the <strong>stk::Clarinet<\/strong> synthesis class and show how its frequency can be modified over time. The instruments are all implementing the noteOn() and noteOff() methods. The noteOff() method need to be explicitly called on the Instruments where the tone is not decaying over time.<\/p>\n<pre><code><br \/>#include \"ArdStreamOut.h\"\n#include \"ArdMidiCommon.h\"\n#include \"Clarinet.h\"\n\nusing namespace stk;\n\nArdStreamOut output(Serial);\nClarinet instrument(440);\nint note = 90; \/\/ starting midi note\n\nvoid setup() {\n  Serial.begin(115200);\n}\n\nvoid loop() {\n  note += rand() % 10 - 5; \/\/ generate some random offset\n  float frequency = ArdMidiCommon::noteToFrequency(note);\n\n  instrument.noteOn( frequency, 0.5 );\n  long endTime = millis()+1000;\n  while (millis()&lt;endTime){\n      output.tick( instrument.tick() );\n  }\n  delay( 100 );\n\n}\n\n<\/code><\/pre>\n<p>That&#8217;s not too difficult to get an instrument to play. It would be quite natural to link the instrument up to process incoming Midi Messages. But we get to this later on.<\/p>\n<p>Unfortunately quite a few instruments are using <strong>sampled raw files<\/strong> as input. I am still working on a work-around for this. Here is the class overview of all instruments<\/p>\n<pre><code>              .- FM - (HevyMetl, PercFlut, Rhodey, Wurley, TubeBell, BeeThree, FMVoices)\n              |\n              |- Modal - ModalBar\n              |\n              |- VoicForm\n              |\n              |- Sampler - Moog\n              |\n              |- Resonate\n              |\n              |- Mandolin\n  - Instrmnt -|\n              |- Drummer\n              |\n              |- Clarinet, BlowHole, Saxofony, Flute, Brass, BlowBotl,\n              |  Bowed, Plucked, StifKarp, Sitar, Recorder\n              |\n              |- Shakers\n              |\n              |- BandedWG\n              |\n              |- Mesh2D\n              |\n              .- Whistle\n<\/code><\/pre>\n<h2>Sending the output of Instruments to Bluetooth<\/h2>\n<p>I was starting to get into the STK framework when I was looking to implement some ways to generate sound for my <a href=\"https:\/\/github.com\/pschatzmann\/ESP32-A2DP\">Bluetooth A2DP Sink<\/a>.<\/p>\n<p>I have added this functionality as well:<\/p>\n<pre><code>#include \"ArdBtSource.h\"\n#include \"ArdMidiCommon.h\"\n#include \"Clarinet.h\"\n#include \"Voicer.h\"\n\nusing namespace stk;\n\nClarinet clarinet(440);\nVoicer voicer;\nArdBtSource bt;\nStkFloat note = 64; \/\/ 0 to 128\nStkFloat amplitude = 100; \/\/ 0 to 128\n\nvoid setup() {\n  Serial.begin(115200);\n  Stk::setSampleRate( 44100.0 );\n  voicer.addInstrument(&amp;clarinet);\n\n  bt.start(\"RadioPlayer\", voicer);\n}\n\nvoid loop() {\n  if (bt.isConnected()) {\n    Serial.print(\"playing \");\n    Serial.println(++note);\n\n    voicer.noteOn( note, amplitude );\n    delay(900);\n    voicer.noteOff( note, 20 );\n    delay(200);\n    if (note&gt;=90) {\n      note = 30;\n    }\n  }\n}\n<\/code><\/pre>\n<p>The <strong>Voicer<\/strong> is basically just a simple way to play multiple instruments at the same time. The Bluetooth functionality is made available by the <strong>ArdBtSource<\/strong> class. The start command launches a connection to the &#8220;RadioPlayer&#8221; Bluetooth sink (e.g speakers).<\/p>\n<p>Please note that unlike the instruments which expect a frequency, the Voicer is expecting a Midi note as input!<\/p>\n<p>And this introduces us to the next topic. I am about to add some <strong>Midi functionality<\/strong> to the framework. But this will be the topic in one of my <strong>next posts<\/strong>. In the meantime if you are curious you can have a look at the <a href=\"https:\/\/ccrma.stanford.edu\/software\/stk\/classes.html\">class documentation provided by the current framework<\/a>.<\/p>\n<h2>Conclusion<\/h2>\n<p>The ESP32 provides <strong>enough power<\/strong> do generate music and with it&#8217;s <strong>WIFI and Bluetooth<\/strong> functionality it can be the basis for some <strong>very interesting music projects<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I made the Synthesis ToolKit (SKT) available as Arduino Library. The Synthesis ToolKit in C++ (STK) is a set of open source audio signal processing and algorithmic synthesis classes written in the C++ programming language. STK was designed to facilitate rapid development of music synthesis and audio processing software, with [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1872,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[20,22],"tags":[34,26],"class_list":["post-1853","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-machine-sound","tag-stk","tag-synthesizer"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>The Synthesis ToolKit (STK) Library for the Arduino ESP32 - An Introduction - Phil Schatzmann<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The Synthesis ToolKit (STK) Library for the Arduino ESP32 - An Introduction - Phil Schatzmann\" \/>\n<meta property=\"og:description\" content=\"I made the Synthesis ToolKit (SKT) available as Arduino Library. The Synthesis ToolKit in C++ (STK) is a set of open source audio signal processing and algorithmic synthesis classes written in the C++ programming language. STK was designed to facilitate rapid development of music synthesis and audio processing software, with [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/\" \/>\n<meta property=\"og:site_name\" content=\"Phil Schatzmann\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-24T09:17:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-12-25T14:20:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/Oboe.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"268\" \/>\n\t<meta property=\"og:image:height\" content=\"188\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"pschatzmann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"pschatzmann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/24\\\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/24\\\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\\\/\"},\"author\":{\"name\":\"pschatzmann\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"headline\":\"The Synthesis ToolKit (STK) Library for the Arduino ESP32 &#8211; An Introduction\",\"datePublished\":\"2020-09-24T09:17:12+00:00\",\"dateModified\":\"2021-12-25T14:20:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/24\\\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\\\/\"},\"wordCount\":867,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/24\\\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/Oboe.jpeg\",\"keywords\":[\"STK\",\"Synthesizer\"],\"articleSection\":[\"Arduino\",\"Machine Sound\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/24\\\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/24\\\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\\\/\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/24\\\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\\\/\",\"name\":\"The Synthesis ToolKit (STK) Library for the Arduino ESP32 - An Introduction - Phil Schatzmann\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/24\\\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/24\\\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/Oboe.jpeg\",\"datePublished\":\"2020-09-24T09:17:12+00:00\",\"dateModified\":\"2021-12-25T14:20:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/24\\\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/24\\\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/24\\\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/Oboe.jpeg\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/Oboe.jpeg\",\"width\":268,\"height\":188},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/24\\\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The Synthesis ToolKit (STK) Library for the Arduino ESP32 &#8211; An Introduction\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\",\"name\":\"Phil Schatzmann Consulting\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\",\"name\":\"pschatzmann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"width\":305,\"height\":305,\"caption\":\"pschatzmann\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"The Synthesis ToolKit (STK) Library for the Arduino ESP32 - An Introduction - Phil Schatzmann","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/","og_locale":"en_US","og_type":"article","og_title":"The Synthesis ToolKit (STK) Library for the Arduino ESP32 - An Introduction - Phil Schatzmann","og_description":"I made the Synthesis ToolKit (SKT) available as Arduino Library. The Synthesis ToolKit in C++ (STK) is a set of open source audio signal processing and algorithmic synthesis classes written in the C++ programming language. STK was designed to facilitate rapid development of music synthesis and audio processing software, with [&hellip;]","og_url":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/","og_site_name":"Phil Schatzmann","article_published_time":"2020-09-24T09:17:12+00:00","article_modified_time":"2021-12-25T14:20:59+00:00","og_image":[{"width":268,"height":188,"url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/Oboe.jpeg","type":"image\/jpeg"}],"author":"pschatzmann","twitter_card":"summary_large_image","twitter_misc":{"Written by":"pschatzmann","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/#article","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/"},"author":{"name":"pschatzmann","@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"headline":"The Synthesis ToolKit (STK) Library for the Arduino ESP32 &#8211; An Introduction","datePublished":"2020-09-24T09:17:12+00:00","dateModified":"2021-12-25T14:20:59+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/"},"wordCount":867,"commentCount":2,"publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/Oboe.jpeg","keywords":["STK","Synthesizer"],"articleSection":["Arduino","Machine Sound"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/","url":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/","name":"The Synthesis ToolKit (STK) Library for the Arduino ESP32 - An Introduction - Phil Schatzmann","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/#primaryimage"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/Oboe.jpeg","datePublished":"2020-09-24T09:17:12+00:00","dateModified":"2021-12-25T14:20:59+00:00","breadcrumb":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/#primaryimage","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/Oboe.jpeg","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/Oboe.jpeg","width":268,"height":188},{"@type":"BreadcrumbList","@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/24\/the-synthesis-toolkit-skt-library-for-the-arduino-esp32\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pschatzmann.ch\/home\/"},{"@type":"ListItem","position":2,"name":"The Synthesis ToolKit (STK) Library for the Arduino ESP32 &#8211; An Introduction"}]},{"@type":"WebSite","@id":"https:\/\/www.pschatzmann.ch\/home\/#website","url":"https:\/\/www.pschatzmann.ch\/home\/","name":"Phil Schatzmann Consulting","description":"","publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.pschatzmann.ch\/home\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1","name":"pschatzmann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","width":305,"height":305,"caption":"pschatzmann"},"logo":{"@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png"}}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/1853","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/comments?post=1853"}],"version-history":[{"count":36,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/1853\/revisions"}],"predecessor-version":[{"id":4063,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/1853\/revisions\/4063"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media\/1872"}],"wp:attachment":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media?parent=1853"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/categories?post=1853"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/tags?post=1853"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}