{"id":1888,"date":"2020-09-26T20:22:53","date_gmt":"2020-09-26T18:22:53","guid":{"rendered":"https:\/\/www.pschatzmann.ch\/home\/?p=1888"},"modified":"2021-12-25T15:21:11","modified_gmt":"2021-12-25T14:21:11","slug":"the-synthesis-toolkit-stk-w-o-files","status":"publish","type":"post","link":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/","title":{"rendered":"The Synthesis Toolkit (STK) Library for the Arduino ESP32 &#8211; Getting rid of Files"},"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>One of the challenges using Microcontrollers is, that you usually don&#8217;t have a <strong>file system<\/strong> available. On the ESP32 we could us <strong>SPIFFS<\/strong> and store the files in Flash memory to make the following example work:<\/p>\n<pre><code>#include \"FileLoop.h\"\n#include \"ArdStreamOut.h\"\n\nusing namespace stk;\n\nFileLoop input;\nArdStreamOut output(Serial);\n\nvoid setup() {\n  Serial.begin(115200);\n\n  input.openFile( \"rawwaves\/sinewave.raw\", true );\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<h2>Some New Memory based Classes<\/h2>\n<p>To avoid this, I was making all <strong>raw files<\/strong> which are provided by the framework available <strong>as c arrays<\/strong> and I have added some additional classes for using them. Here is the example which uses the sound data provided as array:<\/p>\n<pre><code>#include \"ArdStreamOut.h\"\n#include \"MemoryLoop.h\"\n#include \"MemoryFS.h\"\n\nusing namespace stk;\n\nextern const unsigned char sinewave_raw[];\nextern const unsigned int sinewave_raw_len;\n\nMemoryLoop input(new MemoryFS(sinewave_raw, sinewave_raw_len));\nArdStreamOut output(Serial);\n\nvoid setup() {\n  Serial.begin(115200);\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>The <strong>MemoryFS<\/strong> wraps the binary data and needs a byte array and the length. This is then passed as input to the <strong>MemoryLoop<\/strong> class which actually is a child class of the FileLoop.<\/p>\n<p>Here is the output from the Serial Plotter:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-27-at-19.36.01-300x175.png\" alt=\"\" width=\"600\" height=\"200\" class=\"alignnone size-medium wp-image-1932\" \/><\/p>\n<p>We provide the following new classes:<\/p>\n<ul>\n<li><strong>MemoryWvIn<\/strong> similar to the FileWvIn but using an array<\/li>\n<li><strong>MemoryLoop<\/strong> similar to the FileLoop but using an array<\/li>\n<li><strong>MemoryFS<\/strong>  Management of arrays<\/li>\n<\/ul>\n<h2>Sound C Files<\/h2>\n<p>The sound files have been generated with the help of <em>xxd<\/em>. Here is e.g. the content of the <em>zz-raw-sinwave.c<\/em> file:<\/p>\n<pre><code> const unsigned char sinewave_raw[]  = {\n  0x00, 0x00, 0x00, 0xc9, 0x01, 0x92, 0x02, 0x5b, 0x03, 0x24, 0x03, 0xed,\n  0x04, 0xb6, 0x05, 0x7e, 0x06, 0x47, 0x07, 0x10, 0x07, 0xd9, 0x08, 0xa1,\n  ...\n  0xf8, 0x27, 0xf8, 0xf0, 0xf9, 0xb9, 0xfa, 0x82, 0xfb, 0x4a, 0xfc, 0x13,\n  0xfc, 0xdc, 0xfd, 0xa5, 0xfe, 0x6e, 0xff, 0x37\n};\nunsigned int sinewave_raw_len = 2048;\n<\/code><\/pre>\n<p>It is a little bit tricky to process this data without the classes described above but here is a sketch that reads this data back into something meaningful:<\/p>\n<pre><code>#include \"Stk.h\"\n\nusing namespace stk;\n\nextern const unsigned char sinewave_raw[];\nextern const unsigned int sinewave_raw_len;\n\nvoid setup() {\n  Serial.begin(115200);\n}\n\nvoid loop() {\n  int16_t value;\n  for (int j=0;j&lt;sinewave_raw_len;j+=2){\n    memcpy_P(&amp;value, &amp;(sinewave_raw[j]), 2);\n    Stk::swap16((unsigned char *)&amp;value);\n    Serial.println(value);\n  }\n}\n<\/code><\/pre>\n<p>We have a couple of challenges here:<\/p>\n<ul>\n<li>The data which is defined as const unsigned char sinewave_raw[] &#8211; should actually be represented as a <strong>int16_t<\/strong> array.<\/li>\n<li>Unfortunately, because the data is stored in <strong>program memory<\/strong> it must be read back in <strong>chunks of 4 bytes<\/strong>. The memcpy_P is helping us to do this!<\/li>\n<li>The ESP processor is big endian &#8211; however the data is stored as little endian, so we need to <strong>swap the bytes<\/strong> in the integer. <\/li>\n<\/ul>\n<p>Here is the result from the Serial Plotter:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-27-at-19.09.30-300x101.png\" alt=\"\" width=\"600\" height=\"200\" class=\"alignnone size-medium wp-image-1929\" srcset=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-27-at-19.09.30-300x101.png 300w, https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-27-at-19.09.30-768x257.png 768w, https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-27-at-19.09.30.png 1378w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<h2>Behind the Scene<\/h2>\n<p>I have extended all Instruments that are using files to use this concept as well. Here is the example of the <strong>Rhodey<\/strong> class:<\/p>\n<pre><code>Rhodey :: Rhodey( void )\n  : FM()\n{\n  #ifdef __VFS__\n  \/\/ Concatenate the STK rawwave path to the rawwave files\n  for ( unsigned int i=0; i&lt;3; i++ )\n    waves_[i] = new MemoryLoop( (Stk::rawwavePath() + \"sinewave.raw\").c_str(), sinewave_raw,sinewave_raw_len );\n  waves_[3] = new MemoryLoop( (Stk::rawwavePath() + \"fwavblnk.raw\").c_str(), fwavblnk_raw,fwavblnk_raw_len );\n  #else\n  \/\/ Concatenate the STK rawwave path to the rawwave files\n  for ( unsigned int i=0; i&lt;3; i++ )\n    waves_[i] = new FileLoop( (Stk::rawwavePath() + \"sinewave.raw\").c_str(), true );\n  waves_[3] = new FileLoop( (Stk::rawwavePath() + \"fwavblnk.raw\").c_str(), true );\n  #endif\n<\/code><\/pre>\n<p>If the <code>__VFS__<\/code> has been defined in the <strong>ArdConfig.h<\/strong> configuration file then all instruments are using the memory based implementation and do not require any files! The option is automatically activated if you use the ESP32. You can comment out the <code>#define __VFS__<\/code> in ArdConfig.h if you still want to work with files&#8230;<\/p>\n<h2>Adapting the Configuration<\/h2>\n<p>The configuration include file (<strong>ArdConfig.h<\/strong>) can be used to activate\/deactivate functionality based on the environment. Here is the content for the ESP32:<\/p>\n<pre><code>#ifdef ESP32    \n    #define __RTOS__ \/\/ supports Free RTOS\n    #define __LWIP__  \/\/ use lwip socket implementation\n    #define __ESP__   \/\/ functionality developped for esp32 and esp8266\n    #define __VFS__   \/\/ raw files as compilable c arrays\n    #define TASK_STACK_SIZE configMINIMAL_STACK_SIZE\n\n    #ifdef __RTOS__  \n        #include \"FreeRTOS.h\"\n    #endif\n\n#endif\n\n<\/code><\/pre>\n<p>Please note that this is pretty much work in process and some things might change here!<\/p>\n<h2>Conclusion<\/h2>\n<p>It was the goal to make also the file based instruments easily available to the ESP32. I think this goal has been achieved.<\/p>\n<p>With this concept, the raw files are stored in <strong>flash memory<\/strong>. E.g the Wroom32 has 4MByte available and the raw files of the framework are only using around 397 KB!<\/p>\n<p>In the next post I will give an overview of the new Midi functionality&#8230;<\/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":1901,"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-1888","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 - Getting rid of Files - 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\/26\/the-synthesis-toolkit-stk-w-o-files\/\" \/>\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 - Getting rid of Files - 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\/26\/the-synthesis-toolkit-stk-w-o-files\/\" \/>\n<meta property=\"og:site_name\" content=\"Phil Schatzmann\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-26T18:22:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-12-25T14:21:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/piano.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"275\" \/>\n\t<meta property=\"og:image:height\" content=\"183\" \/>\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=\"4 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\\\/26\\\/the-synthesis-toolkit-stk-w-o-files\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/26\\\/the-synthesis-toolkit-stk-w-o-files\\\/\"},\"author\":{\"name\":\"pschatzmann\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"headline\":\"The Synthesis Toolkit (STK) Library for the Arduino ESP32 &#8211; Getting rid of Files\",\"datePublished\":\"2020-09-26T18:22:53+00:00\",\"dateModified\":\"2021-12-25T14:21:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/26\\\/the-synthesis-toolkit-stk-w-o-files\\\/\"},\"wordCount\":560,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/26\\\/the-synthesis-toolkit-stk-w-o-files\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/piano.jpeg\",\"keywords\":[\"STK\",\"Synthesizer\"],\"articleSection\":[\"Arduino\",\"Machine Sound\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/26\\\/the-synthesis-toolkit-stk-w-o-files\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/26\\\/the-synthesis-toolkit-stk-w-o-files\\\/\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/26\\\/the-synthesis-toolkit-stk-w-o-files\\\/\",\"name\":\"The Synthesis Toolkit (STK) Library for the Arduino ESP32 - Getting rid of Files - Phil Schatzmann\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/26\\\/the-synthesis-toolkit-stk-w-o-files\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/26\\\/the-synthesis-toolkit-stk-w-o-files\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/piano.jpeg\",\"datePublished\":\"2020-09-26T18:22:53+00:00\",\"dateModified\":\"2021-12-25T14:21:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/26\\\/the-synthesis-toolkit-stk-w-o-files\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/26\\\/the-synthesis-toolkit-stk-w-o-files\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/26\\\/the-synthesis-toolkit-stk-w-o-files\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/piano.jpeg\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/piano.jpeg\",\"width\":275,\"height\":183},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2020\\\/09\\\/26\\\/the-synthesis-toolkit-stk-w-o-files\\\/#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; Getting rid of Files\"}]},{\"@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 - Getting rid of Files - 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\/26\/the-synthesis-toolkit-stk-w-o-files\/","og_locale":"en_US","og_type":"article","og_title":"The Synthesis Toolkit (STK) Library for the Arduino ESP32 - Getting rid of Files - 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\/26\/the-synthesis-toolkit-stk-w-o-files\/","og_site_name":"Phil Schatzmann","article_published_time":"2020-09-26T18:22:53+00:00","article_modified_time":"2021-12-25T14:21:11+00:00","og_image":[{"width":275,"height":183,"url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/piano.jpeg","type":"image\/jpeg"}],"author":"pschatzmann","twitter_card":"summary_large_image","twitter_misc":{"Written by":"pschatzmann","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/#article","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/"},"author":{"name":"pschatzmann","@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"headline":"The Synthesis Toolkit (STK) Library for the Arduino ESP32 &#8211; Getting rid of Files","datePublished":"2020-09-26T18:22:53+00:00","dateModified":"2021-12-25T14:21:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/"},"wordCount":560,"commentCount":0,"publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/piano.jpeg","keywords":["STK","Synthesizer"],"articleSection":["Arduino","Machine Sound"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/","url":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/","name":"The Synthesis Toolkit (STK) Library for the Arduino ESP32 - Getting rid of Files - Phil Schatzmann","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/#primaryimage"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/piano.jpeg","datePublished":"2020-09-26T18:22:53+00:00","dateModified":"2021-12-25T14:21:11+00:00","breadcrumb":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/#primaryimage","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/piano.jpeg","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2020\/09\/piano.jpeg","width":275,"height":183},{"@type":"BreadcrumbList","@id":"https:\/\/www.pschatzmann.ch\/home\/2020\/09\/26\/the-synthesis-toolkit-stk-w-o-files\/#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; Getting rid of Files"}]},{"@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\/1888","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=1888"}],"version-history":[{"count":48,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/1888\/revisions"}],"predecessor-version":[{"id":1988,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/1888\/revisions\/1988"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media\/1901"}],"wp:attachment":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media?parent=1888"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/categories?post=1888"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/tags?post=1888"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}