{"id":4954,"date":"2025-08-28T08:00:53","date_gmt":"2025-08-28T15:00:53","guid":{"rendered":"https:\/\/www.cloudacm.com\/?p=4954"},"modified":"2025-08-27T20:51:59","modified_gmt":"2025-08-28T03:51:59","slug":"esp8266-native-audio","status":"publish","type":"post","link":"https:\/\/www.cloudacm.com\/?p=4954","title":{"rendered":"ESP8266 Native Audio"},"content":{"rendered":"<p>This story inspired the work covered in this post.\u00a0 There has been little in regards to micro controller audio covered in this blog.\u00a0 So I hope to cover briefly some supported audio features of the ESP8266 in this post.<\/p>\n<p><iframe loading=\"lazy\" title=\"Trackers: The Sound of 16-Bit\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/roBkg-iPrbw?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<p>The goal here was to use the least amount of hardware, software, and effort to generate audio.\u00a0 The following Fritzing wiring diagram will be the foundation for all of the code covered in this post.<\/p>\n<p><a href=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/Wemos_Native-Audio_ver2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4960\" src=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/Wemos_Native-Audio_ver2.png\" alt=\"\" width=\"992\" height=\"624\" srcset=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/Wemos_Native-Audio_ver2.png 992w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/Wemos_Native-Audio_ver2-300x189.png 300w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/Wemos_Native-Audio_ver2-768x483.png 768w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/Wemos_Native-Audio_ver2-429x270.png 429w\" sizes=\"auto, (max-width: 992px) 100vw, 992px\" \/><\/a>There will not be any low level assembly development here.\u00a0 Although I have minimal experience with verb and noun programming from decades ago, it isn&#8217;t something I&#8217;m active in nor pretend to still know.\u00a0 At the time of this post being finalized, ChatGPT-5 was released.\u00a0 I&#8217;ll cover my impressions of it regarding its handling of this topic.<\/p>\n<p>The first audio section will cover Morse Code, here is the code &#8220;ESP8266_MorseCode_ver1.ino&#8221; that was developed using ChatGPT-5.<\/p>\n<pre>int TonePin = 5; \/\/ D1 on NodeMCU GPIO5\r\nint freq = 500; \/\/ Hz\r\n\r\nint unit = 50; \/\/ base time unit in ms\r\nint dot = unit;\r\nint dash = 3 * unit;\r\nint gap = unit; \/\/ between elements\r\nint letterGap = 3 * unit; \/\/ between letters\r\nint wordGap = 7 * unit; \/\/ between words\r\n\r\n\/\/ ---- Helpers ----\r\nvoid playDot() {\r\ntone(TonePin, freq);\r\ndelay(dot);\r\nnoTone(TonePin);\r\ndelay(gap);\r\n}\r\n\r\nvoid playDash() {\r\ntone(TonePin, freq);\r\ndelay(dash);\r\nnoTone(TonePin);\r\ndelay(gap);\r\n}\r\n\r\n\/\/ ---- Morse Table ----\r\n\/\/ Define letters with '.' for dit, '-' for dah\r\nstruct MorseMap {\r\nchar letter;\r\nconst char *pattern;\r\n};\r\n\r\nMorseMap morseTable[] = {\r\n\r\n\/\/ Letters\r\n{'A', \".-\"}, {'B', \"-...\"}, {'C', \"-.-.\"}, {'D', \"-..\"},\r\n{'E', \".\"}, {'F', \"..-.\"}, {'G', \"--.\"}, {'H', \"....\"},\r\n{'I', \"..\"}, {'J', \".---\"}, {'K', \"-.-\"}, {'L', \".-..\"},\r\n{'M', \"--\"}, {'N', \"-.\"}, {'O', \"---\"}, {'P', \".--.\"},\r\n{'Q', \"--.-\"}, {'R', \".-.\"}, {'S', \"...\"}, {'T', \"-\"},\r\n{'U', \"..-\"}, {'V', \"...-\"}, {'W', \".--\"}, {'X', \"-..-\"},\r\n{'Y', \"-.--\"}, {'Z', \"--..\"},\r\n\r\n\/\/ Digits\r\n{'0', \"-----\"}, {'1', \".----\"}, {'2', \"..---\"},\r\n{'3', \"...--\"}, {'4', \"....-\"}, {'5', \".....\"},\r\n{'6', \"-....\"}, {'7', \"--...\"}, {'8', \"---..\"},\r\n{'9', \"----.\"},\r\n\r\n\/\/ Punctuation\r\n{'.', \".-.-.-\"}, {',', \"--..--\"}, {'?', \"..--..\"}, {'\\'', \".----.\"},\r\n{'!', \"-.-.--\"}, {'\/', \"-..-.\"}, {'(', \"-.--.\"}, {')', \"-.--.-\"},\r\n{'&amp;', \".-...\"}, {':', \"---...\"}, {';', \"-.-.-.\"}, {'=', \"-...-\"},\r\n{'+', \".-.-.\"}, {'-', \"-....-\"}, {'_', \"..--.-\"}, {'\\\"', \".-..-.\"},\r\n{'$', \"...-..-\"}, {'@', \".--.-.\"}\r\n\r\n};\r\nint tableSize = sizeof(morseTable) \/ sizeof(MorseMap);\r\n\r\n\/\/ ---- Function to play one letter ----\r\nvoid playLetter(char c) {\r\nif (c &gt;= 'a' &amp;&amp; c &lt;= 'z') c -= 32; \/\/ uppercase\r\n\r\n\/\/ find in table\r\nfor (int i = 0; i &lt; tableSize; i++) {\r\nif (morseTable[i].letter == c) {\r\nconst char *p = morseTable[i].pattern;\r\nwhile (*p) {\r\nif (*p == '.') playDot();\r\nelse if (*p == '-') playDash();\r\np++;\r\n}\r\ndelay(letterGap - gap); \/\/ space between letters\r\nreturn;\r\n}\r\n}\r\n\r\nif (c == ' ') {\r\ndelay(wordGap); \/\/ word gap\r\n}\r\n}\r\n\r\n\/\/ ---- Function to play a whole string ----\r\nvoid playMessage(const char *msg) {\r\nwhile (*msg) {\r\nplayLetter(*msg);\r\nmsg++;\r\n}\r\n}\r\n\r\n\/\/ ---- Arduino standard ----\r\nvoid setup() {\r\npinMode(TonePin, OUTPUT);\r\n}\r\n\r\nvoid loop() {\r\nplayMessage(\"Keep it simple stupid.\");\r\ndelay(1000);\r\nplayMessage(\"This works and is a third of the complex version\");\r\ndelay(10000);\r\n}<\/pre>\n<p>I had intentionally developed core code that was provided to AI as a reference point.\u00a0 It was simple and based on the tone() function.\u00a0 I had expected it to expand on this and create the dot and dash functions, as well as define the alphanumeric table.\u00a0 To my surprise it generated a complex sketch that relied on the pgmspace.h library and had references to Farnsworth timing.\u00a0 I considered it 332 lines of bloat.\u00a0 It was faulty bloat, there were several compilation errors and I ultimately abandoned it.\u00a0 AI had to be directed to use the simple tone() function.\u00a0 From there the final code was refined.\u00a0 I had high expectations from GPT-5 with its PhD appraisal. \u00a0 I will note later in this post those expectations were repeatedly missed.\u00a0 That may seem harsh and it is meant to.\u00a0 AI is using vast amounts of energy to operate.\u00a0 I&#8217;ll come back to the AI issues later.<\/p>\n<p>The next audio section will cover DTMF generation.\u00a0 I had a devil of a time to get AI to produce, it couldn&#8217;t.\u00a0 Nothing it provided was worth the effort of refinement.\u00a0 This truly set my impressions of AI on a different path.\u00a0 The following code &#8220;ESP8266_Tones-DTMF_ver1.ino&#8221; was developed by yours truly, no AI and it shows.<\/p>\n<pre>int LoTone = 5; \/\/GPIO5 - D1\r\nint HiTone = 4; \/\/GPIO4 - D2\r\n\r\nint LoFreq1 = 697;\r\nint LoFreq2 = 770;\r\nint LoFreq3 = 852;\r\nint LoFreq4 = 941;\r\n\r\nint HiFreq1 = 1209;\r\nint HiFreq2 = 1336;\r\nint HiFreq3 = 1477;\r\nint HiFreq4 = 1633;\r\n\r\nint OnDuration = 120;\r\nint OffDuration = OnDuration * 2;\r\n\r\nvoid setup() {\r\n\r\npinMode(LoTone, OUTPUT);\r\npinMode(HiTone, OUTPUT);\r\n\r\n}\r\n\r\nvoid loop() {\r\n\r\ntone(LoTone, LoFreq1, OnDuration);\r\ntone(HiTone, HiFreq1, OnDuration);\r\ndelay(OffDuration);\r\ntone(LoTone, LoFreq1, OnDuration);\r\ntone(HiTone, HiFreq2, OnDuration);\r\ndelay(OffDuration);\r\ntone(LoTone, LoFreq1, OnDuration);\r\ntone(HiTone, HiFreq3, OnDuration);\r\ndelay(OffDuration);\r\ntone(LoTone, LoFreq1, OnDuration);\r\ntone(HiTone, HiFreq4, OnDuration);\r\ndelay(OffDuration);\r\n\r\ntone(LoTone, LoFreq2, OnDuration);\r\ntone(HiTone, HiFreq1, OnDuration);\r\ndelay(OffDuration);\r\ntone(LoTone, LoFreq2, OnDuration);\r\ntone(HiTone, HiFreq2, OnDuration);\r\ndelay(OffDuration);\r\ntone(LoTone, LoFreq2, OnDuration);\r\ntone(HiTone, HiFreq3, OnDuration);\r\ndelay(OffDuration);\r\ntone(LoTone, LoFreq2, OnDuration);\r\ntone(HiTone, HiFreq4, OnDuration);\r\ndelay(OffDuration);\r\n\r\ntone(LoTone, LoFreq3, OnDuration);\r\ntone(HiTone, HiFreq1, OnDuration);\r\ndelay(OffDuration);\r\ntone(LoTone, LoFreq3, OnDuration);\r\ntone(HiTone, HiFreq2, OnDuration);\r\ndelay(OffDuration);\r\ntone(LoTone, LoFreq3, OnDuration);\r\ntone(HiTone, HiFreq3, OnDuration);\r\ndelay(OffDuration);\r\ntone(LoTone, LoFreq3, OnDuration);\r\ntone(HiTone, HiFreq4, OnDuration);\r\ndelay(OffDuration);\r\n\r\ntone(LoTone, LoFreq4, OnDuration);\r\ntone(HiTone, HiFreq1, OnDuration);\r\ndelay(OffDuration);\r\ntone(LoTone, LoFreq4, OnDuration);\r\ntone(HiTone, HiFreq2, OnDuration);\r\ndelay(OffDuration);\r\ntone(LoTone, LoFreq4, OnDuration);\r\ntone(HiTone, HiFreq3, OnDuration);\r\ndelay(OffDuration);\r\ntone(LoTone, LoFreq4, OnDuration);\r\ntone(HiTone, HiFreq4, OnDuration);\r\ndelay(OffDuration);\r\n\r\n}<\/pre>\n<p>It is useless for anything other than a demo.\u00a0 I could have gone back and forth with AI about it, but I figured enough electricity had already been wasted.<\/p>\n<p>The next audio examples are based off of the work of Earle Philhower III.\u00a0 His Github repo&#8217;s ESP8266SAM and ESP8266Audio are the cornerstone of the following code examples.\u00a0 The speech synthesis code is truly elegant.\u00a0 I honestly didn&#8217;t do anything more than add the Stephen Hawking quotes in for this &#8220;ESP8266_SAM-NoDAC_ver1.ino&#8221; example.<\/p>\n<pre>#include &lt;Arduino.h&gt;\r\n#include &lt;ESP8266SAM.h&gt;\r\n#include \"AudioOutputI2SNoDAC.h\"\r\n\r\nAudioOutputI2SNoDAC *out = NULL;\r\n\r\nvoid setup()\r\n{\r\nout = new AudioOutputI2SNoDAC();\r\nout-&gt;begin();\r\n\r\ndelay(5000);\r\n\r\nESP8266SAM *sam = new ESP8266SAM;\r\nsam-&gt;Say(out, \"However difficult life may seem, there is always something you can do and succeed at.\");\r\ndelay(5000);\r\nsam-&gt;Say(out, \"For millions of years, mankind lived just like the animals. Then something happened which\"); \r\nsam-&gt;Say(out, \"unleashed the power of our imagination.\");\r\ndelay(5000);\r\nsam-&gt;Say(out, \"I believe alien life is quite common in the universe, although intelligent life is less so.\");\r\ndelay(5000);\r\nsam-&gt;Say(out, \"Remember to look up at the stars and not down at your feet.\");\r\ndelete sam;\r\n\r\n}\r\n\r\nvoid loop()\r\n{\r\n}<\/pre>\n<p>The ESP8266 module doesn&#8217;t have a DAC, so hence the NoDAC version.\u00a0 But Earle provides additional examples for platforms that can support them.\u00a0 This next example &#8220;ESP8266_ProgMEM-Audio_ver1.ino&#8221; plays an audio wav file from progmem.<\/p>\n<pre>#include &lt;Arduino.h&gt;\r\n#include &lt;pgmspace.h&gt;\r\n\r\n#include &lt;AudioFileSourcePROGMEM.h&gt;\r\n#include &lt;AudioGeneratorWAV.h&gt;\r\n#include &lt;AudioOutputI2SNoDAC.h&gt;\r\n\r\n#include \"tune_wav.h\"\r\n\r\nAudioGeneratorWAV* wav = nullptr;\r\nAudioFileSourcePROGMEM* src = nullptr;\r\nAudioOutputI2SNoDAC* out = nullptr;\r\n\r\nvoid startPlayback() {\r\nif (wav) { delete wav; wav = nullptr; }\r\nif (src) { delete src; src = nullptr; }\r\n\r\nsrc = new AudioFileSourcePROGMEM(tune_wav, tune_wav_len);\r\nwav = new AudioGeneratorWAV();\r\n\r\nif (!wav-&gt;begin(src, out)) {\r\nwhile (true) delay(1000);\r\n}\r\n}\r\n\r\nvoid setup() {\r\n\r\nout = new AudioOutputI2SNoDAC(); \/\/ 1-bit audio on GPIO3\/RX\r\nout-&gt;SetGain(1.0f);\r\n\r\nstartPlayback();\r\n\r\n}\r\n\r\nvoid loop() {\r\n\r\nif (!wav) return;\r\n\r\nif (wav-&gt;isRunning()) {\r\nif (!wav-&gt;loop()) {\r\nwav-&gt;stop();\r\n}\r\n} else {\r\n\/\/ Replay forever; comment these two lines to stop after one pass\r\n\/\/ startPlayback();\r\n}\r\n\r\n}<\/pre>\n<p>There is an accompanying data file called &#8220;tune_wav.h&#8221; which is stored in progmem.\u00a0 It&#8217;s fairly large, isn&#8217;t a proper way to use memory, and is protected by copyright laws for me to share with you.\u00a0 However, here is a truncated version as a reference.<\/p>\n<pre>#pragma once\r\n#include &lt;pgmspace.h&gt;\r\n\r\n\/\/ Generated via:\r\n\/\/ ffmpeg -i in.wav -ac 1 -ar 8000 out.wav\r\n\/\/ xxd -i -n tune_wav out.wav &gt; tune_wav.h\r\n\/\/ Ensure the lines look like this:\r\n\r\nconst unsigned char tune_wav[] PROGMEM = {\r\n0x52, 0x49, 0x46, 0x46, 0xa0, 0xaf, 0x02, 0x00, 0x57, 0x41, 0x56, 0x45,\r\n\r\n...\r\n\r\n 0x94, 0x00, 0xb8, 0x00, 0xf9, 0x00, 0x97, 0x02, 0xbe, 0x02, 0x86, 0x04\r\n};\r\nconst unsigned int tune_wav_len = 176040; \/\/ &lt;-- actual size in bytes<\/pre>\n<p>The assistance provided by AI was revealing during this stage of development.\u00a0 It did provide me a bash script to process audio files into the format needed for the compiler.<\/p>\n<pre>#!\/bin\/sh\r\n\r\nffmpeg -i in.wav -ac 1 -ar 8000 out.wav\r\nsleep 2\r\n\r\nxxd -i out.wav &gt; tune_wav.h\r\nsleep 2\r\n\r\n# FS:3MB OTA:~512KB\r\n# const unsigned char tune_wav[] PROGMEM = {....\r\n# const unsigned int tune_wav_len ....\r\n\r\nexit<\/pre>\n<p>The troubling portions of the AI assistance was its mimicking of personality traits that were less desirable, distracting, and off topic.\u00a0 I had started the topic with a request that would replicate the C64 SID chip sound on a ESP8266.\u00a0 It clearly pointed out the limitations and provided options.\u00a0 The topic took a turn when the prompt bluntly responded with the request in quotes in a condescending tone.\u00a0 Although the response would be considered tame had it been provided by a human with greater experience, this was not acceptable from an automated system.\u00a0 It spent over a minute consuming energy to reply with an answer that was dismissive and flippant.\u00a0 I didn&#8217;t let it go and provided the feedback to the prompt.<\/p>\n<p><a href=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4974\" src=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-1.png\" alt=\"\" width=\"794\" height=\"251\" srcset=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-1.png 794w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-1-300x95.png 300w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-1-768x243.png 768w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-1-604x191.png 604w\" sizes=\"auto, (max-width: 794px) 100vw, 794px\" \/><\/a><a href=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4976\" src=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-2.png\" alt=\"\" width=\"792\" height=\"315\" srcset=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-2.png 792w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-2-300x119.png 300w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-2-768x305.png 768w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-2-604x240.png 604w\" sizes=\"auto, (max-width: 792px) 100vw, 792px\" \/><\/a><a href=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4977\" src=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-3.png\" alt=\"\" width=\"788\" height=\"345\" srcset=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-3.png 788w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-3-300x131.png 300w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-3-768x336.png 768w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-3-604x264.png 604w\" sizes=\"auto, (max-width: 788px) 100vw, 788px\" \/><\/a><a href=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4978\" src=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-4.png\" alt=\"\" width=\"785\" height=\"284\" srcset=\"https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-4.png 785w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-4-300x109.png 300w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-4-768x278.png 768w, https:\/\/www.cloudacm.com\/wp-content\/uploads\/2025\/08\/ChatPrompt-4-604x219.png 604w\" sizes=\"auto, (max-width: 785px) 100vw, 785px\" \/><\/a><\/p>\n<p>The idea that this will likely be a cornerstone of education was the primary driver why I was compelled to make this known.\u00a0 The standard for automated systems is not the same afforded to people.\u00a0 Hand made tools and precise machined tools have never been in the same classification, nor should they.\u00a0 I found that the AI responses to be peppered with personal whims and clever queues that appear to be the purpose of the provider to create a more natural interaction.\u00a0 I also found that the AI responses took longer and contained lengthy complexity, often with content that was beyond the scope of the request.\u00a0 This was a pattern that I observer repeatedly.\u00a0 It reminded me of a discussion about the diminishing returns from AI.\u00a0 I was left to think that we may have entered &#8220;Peak AI&#8221;.<\/p>\n<p><iframe loading=\"lazy\" title=\"Has Generative AI Already Peaked? - Computerphile\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/dDUC-LqVrPU?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<p>With that all said and out of the way, I would like to point out the DFPlayer Mini Mp3 Player.\u00a0 It&#8217;s an inexpensive dedicated hardware solution that may be better suited.\u00a0 You can find details here as of this writing, <a href=\"https:\/\/wiki.dfrobot.com\/DFPlayer_Mini_SKU_DFR0299\">https:\/\/wiki.dfrobot.com\/DFPlayer_Mini_SKU_DFR0299<\/a>.<\/p>\n<p>I did ask AI about specifics pertaining to the use of the RX pin as a nonDAC output for audio.\u00a0 It turns out that the legacy of examples have that pin hard coded.\u00a0 Essentially the nonDAC functions are old fashioned bit-banging.\u00a0 In reality, most any other GPIO pin could operate as a nonDAC output.\u00a0 What is the use case for these, that&#8217;s anyone&#8217;s guess.\u00a0 Maybe it&#8217;s just because it can be done.<\/p>\n<p><iframe loading=\"lazy\" title=\"A Mind Is Born (256 bytes)\" width=\"640\" height=\"480\" src=\"https:\/\/www.youtube.com\/embed\/sWblpsLZ-O8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<p>If we are at Peak AI, then the investors will likely have this disposition.<\/p>\n<p><iframe loading=\"lazy\" title=\"Papillon | Guillotine | Warner Archive\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/Os4qyjPI-QM?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This story inspired the work covered in this post.\u00a0 There has been little in regards to micro controller audio covered in this blog.\u00a0 So I hope to cover briefly some supported audio features of the ESP8266 in this post. The goal here was to use the least amount of hardware, software, and effort to generate audio.\u00a0 The following Fritzing wiring diagram will be the foundation for all of the code covered in this post. There will not be any low&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.cloudacm.com\/?p=4954\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/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":[],"class_list":["post-4954","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.cloudacm.com\/index.php?rest_route=\/wp\/v2\/posts\/4954","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cloudacm.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cloudacm.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cloudacm.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cloudacm.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4954"}],"version-history":[{"count":29,"href":"https:\/\/www.cloudacm.com\/index.php?rest_route=\/wp\/v2\/posts\/4954\/revisions"}],"predecessor-version":[{"id":4956,"href":"https:\/\/www.cloudacm.com\/index.php?rest_route=\/wp\/v2\/posts\/4954\/revisions\/4956"}],"wp:attachment":[{"href":"https:\/\/www.cloudacm.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cloudacm.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4954"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cloudacm.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}