{"id":6219,"date":"2024-04-04T21:55:30","date_gmt":"2024-04-04T19:55:30","guid":{"rendered":"https:\/\/www.pschatzmann.ch\/home\/?p=6219"},"modified":"2024-09-30T05:50:44","modified_gmt":"2024-09-30T03:50:44","slug":"arduino-audio-tools-using-tasks","status":"publish","type":"post","link":"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/","title":{"rendered":"Arduino Audio Tools: Using Tasks"},"content":{"rendered":"<p>So far I have always used the Arduino loop to do the audio processing with the hint, that there <strong>must not be any longer delay<\/strong> added to the processing.<\/p>\n<p>If you have some blocking functions in the loop, the solution is to run the audio in a separate task. I have added some nice <a href=\"https:\/\/github.com\/pschatzmann\/arduino-audio-tools\/wiki\/Multicore-Processing\">concurrency C++ classes<\/a> to my framework which help that we can keep the sketch quite short.<\/p>\n<h2>Arduino Example Sketch<\/h2>\n<p>I am using a simple <strong>internet streaming<\/strong> sketch as example which is using some <strong>long delays<\/strong> in the loop(). The copy of the mp3 data from the url to the decoder is executed in a separate task:<\/p>\n<pre><code>#include \"AudioTools.h\"\n#include \"AudioCodecs\/CodecMP3Helix.h\"\n#include \"AudioLibs\/AudioBoardStream.h\"\n\nURLStream url(\"ssid\",\"password\");  \/\/ or replace with ICYStream to get metadata\nAudioBoardStream i2s(AudioKitEs8388V1); \/\/ final output of decoded stream\nEncodedAudioStream dec(&amp;i2s, new MP3DecoderHelix()); \/\/ Decoding stream\nStreamCopy copier(dec, url); \/\/ copy url to decoder\nTask task(\"mp3-copy\", 10000, 1, 0);\n\nvoid setup(){\n  Serial.begin(115200);\n  AudioLogger::instance().begin(Serial, AudioLogger::Info);  \n\n  \/\/ setup i2s\n  auto config = i2s.defaultConfig(TX_MODE);\n  i2s.begin(config);\n\n  \/\/ setup I2S based on sampling rate provided by decoder\n  dec.begin();\n\n  \/\/ mp3 radio\n  url.begin(\"http:\/\/stream.srg-ssr.ch\/m\/rsj\/mp3_128\",\"audio\/mp3\");\n\n  \/\/ start copy task\n  task.begin([](){copier.copy();});\n}\n\nvoid loop(){\n  delay(1000);\n  Serial.println(\"ping...\");\n}\n<\/code><\/pre>\n<p>The core of the example is the Task class which requires a name, the stack size, the priority and the core.<\/p>\n<p>Usually we would just call <strong>copier.copy()<\/strong> in the loop. But in the example we want to do this <strong>in a separate task<\/strong>.<\/p>\n<p>In order to start the task we just call begin() by passing a global method or a lambda expression like in the example above.<\/p>\n<p>Here is the output from the <strong>Serial Monitor<\/strong>:<\/p>\n<pre><code>22:19:33.534 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:33.566 -&gt; ping...\n22:19:33.598 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:33.694 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:33.727 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:33.790 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:33.854 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:33.918 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:33.982 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:34.078 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:34.111 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:34.175 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:34.239 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:34.304 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:34.368 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:34.433 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:34.497 -&gt; [I] StreamCopy.h : 149 - StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n22:19:34.561 -&gt; [I] StreamCopy.h : 149 - ping...\n22:19:34.561 -&gt; StreamCopy::copy  1024 -&gt; 1024 -&gt; 1024 bytes - in 1 hops\n<\/code><\/pre>\n<p>Further information can be found in the <a href=\"https:\/\/github.com\/pschatzmann\/arduino-audio-tools\/wiki\/Multicore-Processing\">Wiki of the AudioTools project<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>So far I have always used the Arduino loop to do the audio processing with the hint, that there must not be any longer delay added to the processing. If you have some blocking functions in the loop, the solution is to run the audio in a separate task. I [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6220,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_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":[],"class_list":["post-6219","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-machine-sound"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Arduino Audio Tools: Using Tasks - 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\/2024\/04\/04\/arduino-audio-tools-using-tasks\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Arduino Audio Tools: Using Tasks - Phil Schatzmann\" \/>\n<meta property=\"og:description\" content=\"So far I have always used the Arduino loop to do the audio processing with the hint, that there must not be any longer delay added to the processing. If you have some blocking functions in the loop, the solution is to run the audio in a separate task. I [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/\" \/>\n<meta property=\"og:site_name\" content=\"Phil Schatzmann\" \/>\n<meta property=\"article:published_time\" content=\"2024-04-04T19:55:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-30T03:50:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/04\/task.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"300\" \/>\n\t<meta property=\"og:image:height\" content=\"168\" \/>\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=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/04\\\/04\\\/arduino-audio-tools-using-tasks\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/04\\\/04\\\/arduino-audio-tools-using-tasks\\\/\"},\"author\":{\"name\":\"pschatzmann\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"headline\":\"Arduino Audio Tools: Using Tasks\",\"datePublished\":\"2024-04-04T19:55:30+00:00\",\"dateModified\":\"2024-09-30T03:50:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/04\\\/04\\\/arduino-audio-tools-using-tasks\\\/\"},\"wordCount\":203,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/04\\\/04\\\/arduino-audio-tools-using-tasks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/task.jpeg\",\"articleSection\":[\"Arduino\",\"Machine Sound\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/04\\\/04\\\/arduino-audio-tools-using-tasks\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/04\\\/04\\\/arduino-audio-tools-using-tasks\\\/\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/04\\\/04\\\/arduino-audio-tools-using-tasks\\\/\",\"name\":\"Arduino Audio Tools: Using Tasks - Phil Schatzmann\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/04\\\/04\\\/arduino-audio-tools-using-tasks\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/04\\\/04\\\/arduino-audio-tools-using-tasks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/task.jpeg\",\"datePublished\":\"2024-04-04T19:55:30+00:00\",\"dateModified\":\"2024-09-30T03:50:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/04\\\/04\\\/arduino-audio-tools-using-tasks\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/04\\\/04\\\/arduino-audio-tools-using-tasks\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/04\\\/04\\\/arduino-audio-tools-using-tasks\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/task.jpeg\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/task.jpeg\",\"width\":300,\"height\":168},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2024\\\/04\\\/04\\\/arduino-audio-tools-using-tasks\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Arduino Audio Tools: Using Tasks\"}]},{\"@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":"Arduino Audio Tools: Using Tasks - 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\/2024\/04\/04\/arduino-audio-tools-using-tasks\/","og_locale":"en_US","og_type":"article","og_title":"Arduino Audio Tools: Using Tasks - Phil Schatzmann","og_description":"So far I have always used the Arduino loop to do the audio processing with the hint, that there must not be any longer delay added to the processing. If you have some blocking functions in the loop, the solution is to run the audio in a separate task. I [&hellip;]","og_url":"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/","og_site_name":"Phil Schatzmann","article_published_time":"2024-04-04T19:55:30+00:00","article_modified_time":"2024-09-30T03:50:44+00:00","og_image":[{"width":300,"height":168,"url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/04\/task.jpeg","type":"image\/jpeg"}],"author":"pschatzmann","twitter_card":"summary_large_image","twitter_misc":{"Written by":"pschatzmann","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/#article","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/"},"author":{"name":"pschatzmann","@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"headline":"Arduino Audio Tools: Using Tasks","datePublished":"2024-04-04T19:55:30+00:00","dateModified":"2024-09-30T03:50:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/"},"wordCount":203,"commentCount":2,"publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/04\/task.jpeg","articleSection":["Arduino","Machine Sound"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/","url":"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/","name":"Arduino Audio Tools: Using Tasks - Phil Schatzmann","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/#primaryimage"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/04\/task.jpeg","datePublished":"2024-04-04T19:55:30+00:00","dateModified":"2024-09-30T03:50:44+00:00","breadcrumb":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/#primaryimage","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/04\/task.jpeg","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2024\/04\/task.jpeg","width":300,"height":168},{"@type":"BreadcrumbList","@id":"https:\/\/www.pschatzmann.ch\/home\/2024\/04\/04\/arduino-audio-tools-using-tasks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pschatzmann.ch\/home\/"},{"@type":"ListItem","position":2,"name":"Arduino Audio Tools: Using Tasks"}]},{"@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\/6219","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=6219"}],"version-history":[{"count":17,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/6219\/revisions"}],"predecessor-version":[{"id":6337,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/6219\/revisions\/6337"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media\/6220"}],"wp:attachment":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media?parent=6219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/categories?post=6219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/tags?post=6219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}