<?xml-stylesheet type="text/xsl" href="https://community.element14.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Playing audio WAV files from a Pico emulated USB Mass Storage Device</title><link>/challenges-projects/design-challenges/pi-fest/b/blog/posts/playing-wav-audio-files-from-usb-folder</link><description>Introduction
I&amp;#39;m no musician or songwriter, so I&amp;#39;ll avoid the blurb about where I got my inspiration from. This Pico project just morphed out of my last project working with a 4-digit 7-segment display and the HC-SR04 ultrasonic sensor... I had a not</description><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><item><title>RE: Playing audio WAV files from a Pico emulated USB Mass Storage Device</title><link>https://community.element14.com/challenges-projects/design-challenges/pi-fest/b/blog/posts/playing-wav-audio-files-from-usb-folder</link><pubDate>Sat, 18 Jun 2022 18:30:05 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:a65f2355-1c6b-4908-b210-adcc7eec2df1</guid><dc:creator>BigG</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I decided to follow through with my idea of using the range finder to trigger audio.&lt;/p&gt;
&lt;p&gt;This application uses both cores. Core 0 handles the audio side and Core 1 handles the range finder.&lt;/p&gt;
&lt;p&gt;The code is not great as it crashes Core 0 quite a bit. I suspect it&amp;#39;s related to the PWM interrupts but I haven&amp;#39;t spent any time debugging. You are more than welcome to work out where the problems are. Here is the code:&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:d32d4b34-3bf6-431e-a219-fd70d60d47ba:type=c_cpp&amp;text=%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0D%0A%20%2A%20This%20example%20reads%20the%20distance%20measured%20by%20an%20HC-SR04%20Ultrasonic%20distance%20sensor%2C%20which%0D%0A%20%2A%20triggers%20audio%2C%20which%20is%20played%20using%20PWM.%0D%0A%20%2A%20%0D%0A%20%2A%20MIT%20License%0D%0A%20%2A%20%0D%0A%20%2A%20Application%20Copyright%20%28c%29%20C%20Gerrish%20%28BigG%29%20-%20relates%20to%20this%20example%0D%0A%20%2A%20%0D%0A%20%2A%20Copyright%20%28c%29%202021%20Robin%20Grosset%20-%20relates%20to%20PWM%20audio%0D%0A%20%2A%20https%3A%2F%2Fgithub.com%2Frgrosset%2Fpico-pwm-audio%0D%0A%20%2A%20%0D%0A%20%2A%20Copyright%20%28c%29%202020-2021%20Alan%20Yorinks%20All%20rights%20reserved%20%28NanoConnectHcSr04%20library%29.%0D%0A%20%2A%20%0D%0A%20%2A%20Source%20on%20how%20to%20read%20header%20info%20from%20WAV%20audio%20file%3A%0D%0A%20%2A%20https%3A%2F%2Fstackoverflow.com%2Fquestions%2F13660777%2Fc-reading-the-data-part-of-a-wav-file%0D%0A%20%2A%20%0D%0A%20%2A%20Permission%20is%20hereby%20granted%2C%20free%20of%20charge%2C%20to%20any%20person%20obtaining%20a%20copy%0D%0A%20%2A%20of%20this%20software%20and%20associated%20documentation%20files%20%28the%20%22Software%22%29%2C%20to%20deal%0D%0A%20%2A%20in%20the%20Software%20without%20restriction%2C%20including%20without%20limitation%20the%20rights%0D%0A%20%2A%20to%20use%2C%20copy%2C%20modify%2C%20merge%2C%20publish%2C%20distribute%2C%20sublicense%2C%20and%2For%20sell%0D%0A%20%2A%20copies%20of%20the%20Software%2C%20and%20to%20permit%20persons%20to%20whom%20the%20Software%20is%0D%0A%20%2A%20furnished%20to%20do%20so%2C%20subject%20to%20the%20following%20conditions%3A%0D%0A%20%2A%20%0D%0A%20%2A%20The%20above%20copyright%20notice%20and%20this%20permission%20notice%20shall%20be%20included%20in%20all%0D%0A%20%2A%20copies%20or%20substantial%20portions%20of%20the%20Software.%0D%0A%20%2A%20%0D%0A%20%2A%20THE%20SOFTWARE%20IS%20PROVIDED%20%22AS%20IS%22%2C%20WITHOUT%20WARRANTY%20OF%20ANY%20KIND%2C%20EXPRESS%20OR%0D%0A%20%2A%20IMPLIED%2C%20INCLUDING%20BUT%20NOT%20LIMITED%20TO%20THE%20WARRANTIES%20OF%20MERCHANTABILITY%2C%0D%0A%20%2A%20FITNESS%20FOR%20A%20PARTICULAR%20PURPOSE%20AND%20NONINFRINGEMENT.%20IN%20NO%20EVENT%20SHALL%20THE%0D%0A%20%2A%20AUTHORS%20OR%20COPYRIGHT%20HOLDERS%20BE%20LIABLE%20FOR%20ANY%20CLAIM%2C%20DAMAGES%20OR%20OTHER%0D%0A%20%2A%20LIABILITY%2C%20WHETHER%20IN%20AN%20ACTION%20OF%20CONTRACT%2C%20TORT%20OR%20OTHERWISE%2C%20ARISING%20FROM%2C%0D%0A%20%2A%20OUT%20OF%20OR%20IN%20CONNECTION%20WITH%20THE%20SOFTWARE%20OR%20THE%20USE%20OR%20OTHER%20DEALINGS%20IN%20THE%0D%0A%20%2A%20SOFTWARE.%0D%0A%0D%0A%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0D%0A%2F%2A%0D%0A%20The%20NanoConnectHcSr04%20library%20is%20free%20software%3B%20you%20can%20redistribute%20it%20and%2For%0D%0A%20modify%20it%20under%20the%20terms%20of%20the%20GNU%20AFFERO%20GENERAL%20PUBLIC%20LICENSE%0D%0A%20Version%203%20as%20published%20by%20the%20Free%20Software%20Foundation%3B%20either%0D%0A%20or%20%28at%20your%20option%29%20any%20later%20version.%0D%0A%20This%20library%20is%20distributed%20in%20the%20hope%20that%20it%20will%20be%20useful%2Cf%0D%0A%20but%20WITHOUT%20ANY%20WARRANTY%3B%20without%20even%20the%20implied%20warranty%20of%0D%0A%20MERCHANTABILITY%20or%20FITNESS%20FOR%20A%20PARTICULAR%20PURPOSE.%20%20See%20the%20GNU%0D%0A%20General%20Public%20License%20for%20more%20details.%0D%0A%20%0D%0A%20%2A%2F%0D%0A%0D%0A%23include%20%3Cstdio.h%3E%0D%0A%23include%20%22stdlib.h%22%20%20%20%2F%2F%20stdlib%20%0D%0A%23include%20%22pico%2Fmulticore.h%22%0D%0A%23include%20%22hardware%2Firq.h%22%20%20%2F%2F%20interrupts%0D%0A%23include%20%22hardware%2Fpwm.h%22%20%20%2F%2F%20pwm%20%0D%0A%23include%20%22hardware%2Fsync.h%22%20%2F%2F%20wait%20for%20interrupt%20%0D%0A%0D%0A%23include%20%22hardware%2Fpll.h%22%0D%0A%23include%20%22hardware%2Fclocks.h%22%0D%0A%0D%0A%23include%20%22PluggableUSBMSD.h%22%0D%0A%23include%20%22FlashIAPBlockDevice.h%22%0D%0A%0D%0A%0D%0A%23include%20%3CNanoConnectHcSr04.h%3E%0D%0A%0D%0A%2F%2F%20LED%20pin%20numbers%3A%0D%0Astatic%20const%20int%20LEDREDPIN%20%3D%20%20%20%2012%3B%2F%2F%20the%20number%20of%20the%20LED%20pin%0D%0Astatic%20const%20int%20LEDGREENPIN%20%3D%20%2013%3B%2F%2F%20the%20number%20of%20the%20LED%20pin%0D%0A%0D%0A%2F%2F%20Audio%20pin%20is%20to%20match%20some%20of%20the%20design%20guide%20shields.%20%0D%0Astatic%20const%20int%20%20AUDIO_PIN%20%3D%20%20%2018%3B%20%20%2F%2F%20you%20can%20change%20this%20to%20whatever%20you%20like%0D%0A%0D%0Astatic%20const%20float%20TRIG_DIST%20%3D%2070.0%3B%0D%0A%0D%0A%2F%2F%20Note%20that%20files%20are%20written%20to%20the%20actual%20root%20directory%20as%20created%20when%20USBMSD%20is%20mounted%0D%0A%2F%2F%20File%20is%20not%20stored%20within%20a%20folder%20called%20root.%0D%0A%2F%2F%20File%20is%20only%20found%20when%20you%20remove%20usb%20and%20replace%20again%0D%0Aconst%20char%20%2Afname1%20%3D%20%22%2Froot%2Fsound1.wav%22%3B%0D%0Aconst%20char%20%2Afname2%20%3D%20%22%2Froot%2Fsound2.wav%22%3B%0D%0A%0D%0Astatic%20FlashIAPBlockDevice%20bd%28XIP_BASE%20%2B%200x100000%2C%200x100000%29%3B%0D%0AUSBMSD%20MassStorage%28%26bd%29%3B%0D%0A%0D%0Astatic%20FILE%20%2Af%20%3D%20nullptr%3B%0D%0A%0D%0Astatic%20uint32_t%20wav_position%20%3D%200%3B%0D%0A%0D%0Astatic%20uint32_t%20ChunkSize%20%3D%200%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20this%20is%20the%20actual%20sound%20data%20size%0D%0Astatic%20uint8_t%2A%20WAV_DATA%3B%0D%0A%0D%0Atypedef%20struct%20%20WAV_HEADER%0D%0A%7B%0D%0A%20%20%20%20%2F%2A%20RIFF%20Chunk%20Descriptor%20%2A%2F%0D%0A%20%20%20%20uint8_t%20%20%20%20%20%20%20%20%20RIFF%5B4%5D%3B%20%20%20%20%20%20%20%20%2F%2F%20RIFF%20Header%20Magic%20header%0D%0A%20%20%20%20uint32_t%20%20%20%20%20%20%20%20ChunkSize%3B%20%20%20%20%20%20%2F%2F%20RIFF%20Chunk%20Size%0D%0A%20%20%20%20uint8_t%20%20%20%20%20%20%20%20%20WAVE%5B4%5D%3B%20%20%20%20%20%20%20%20%2F%2F%20WAVE%20Header%0D%0A%20%20%20%20%2F%2A%20%22fmt%22%20sub-chunk%20%2A%2F%0D%0A%20%20%20%20uint8_t%20%20%20%20%20%20%20%20%20fmt%5B4%5D%3B%20%20%20%20%20%20%20%20%20%2F%2F%20FMT%20header%0D%0A%20%20%20%20uint32_t%20%20%20%20%20%20%20%20Subchunk1Size%3B%20%20%2F%2F%20Size%20of%20the%20fmt%20chunk%0D%0A%20%20%20%20uint16_t%20%20%20%20%20%20%20%20AudioFormat%3B%20%20%20%20%2F%2F%20Audio%20format%201%3DPCM%2C6%3Dmulaw%2C7%3Dalaw%2C%20%20%20%20%20257%3DIBM%20Mu-Law%2C%20258%3DIBM%20A-Law%2C%20259%3DADPCM%0D%0A%20%20%20%20uint16_t%20%20%20%20%20%20%20%20NumOfChan%3B%20%20%20%20%20%20%2F%2F%20Number%20of%20channels%201%3DMono%202%3DSterio%0D%0A%20%20%20%20uint32_t%20%20%20%20%20%20%20%20SamplesPerSec%3B%20%20%2F%2F%20Sampling%20Frequency%20in%20Hz%0D%0A%20%20%20%20uint32_t%20%20%20%20%20%20%20%20bytesPerSec%3B%20%20%20%20%2F%2F%20bytes%20per%20second%0D%0A%20%20%20%20uint16_t%20%20%20%20%20%20%20%20blockAlign%3B%20%20%20%20%20%2F%2F%202%3D16-bit%20mono%2C%204%3D16-bit%20stereo%0D%0A%20%20%20%20uint16_t%20%20%20%20%20%20%20%20bitsPerSample%3B%20%20%2F%2F%20Number%20of%20bits%20per%20sample%0D%0A%20%20%20%20%2F%2A%20%22data%22%20sub-chunk%20%2A%2F%0D%0A%20%20%20%20uint8_t%20%20%20%20%20%20%20%20%20Subchunk2ID%5B4%5D%3B%20%2F%2F%20%22data%22%20%20string%0D%0A%20%20%20%20uint32_t%20%20%20%20%20%20%20%20Subchunk2Size%3B%20%20%2F%2F%20Sampled%20data%20length%0D%0A%7D%20wav_hdr%3B%0D%0A%0D%0A%0D%0A%2F%2F%20D15%20%3D%3D%20trigger%2C%20D14%20%3D%3D%20echo%0D%0A%2F%2F%20Using%20pio0%20and%20sm%200%0D%0ANanoConnectHcSr04%20sonar%2815%2C14%2C%20pio0%2C%200%29%3B%20%2F%2FInstantiate%20HR-SR04%20controller%20object%0D%0A%0D%0A%2F%2F%20distance%20value%20returned%0D%0Astatic%20float%20c1_value%20%3D%200.0%3B%0D%0Astatic%20float%20c1_prev%20%3D%200.0%3B%0D%0Astatic%20uint8_t%20range_mode%20%3D%200%3B%0D%0A%0D%0Astatic%20unsigned%20long%20LED_timer%20%3D%200L%3B%0D%0Astatic%20int%20deciSeconds%20%3D%200%3B%0D%0A%0D%0Astatic%20bool%20redTrigger%20%3D%20false%3B%0D%0Astatic%20bool%20greenTrigger%20%3D%20false%3B%0D%0A%0D%0Astatic%20bool%20TriggerAudio%20%3D%20false%3B%0D%0Astatic%20bool%20TriggerThankyou%20%3D%20false%3B%0D%0A%0D%0A%0D%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0D%0A%20%2A%20Inline%20functions%20to%20enable%20overclocking%0D%0A%20%2A%20%0D%0A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%20%0D%0Avoid%20set_sys_clock_pll%28uint32_t%20vco_freq%2C%20uint%20post_div1%2C%20uint%20post_div2%29%20%7B%0D%0A%20%20if%20%28%21running_on_fpga%28%29%29%20%7B%0D%0A%20%20%20%20clock_configure%28clk_sys%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20CLOCKS_CLK_SYS_CTRL_SRC_VALUE_CLKSRC_CLK_SYS_AUX%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20CLOCKS_CLK_SYS_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2048%20%2A%20MHZ%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2048%20%2A%20MHZ%29%3B%0D%0A%0D%0A%20%20%20%20pll_init%28pll_sys%2C%201%2C%20vco_freq%2C%20post_div1%2C%20post_div2%29%3B%0D%0A%20%20%20%20uint32_t%20freq%20%3D%20vco_freq%20%2F%20%28post_div1%20%2A%20post_div2%29%3B%0D%0A%0D%0A%20%20%20%20%2F%2F%20Configure%20clocks%0D%0A%20%20%20%20%2F%2F%20CLK_REF%20%3D%20XOSC%20%2812MHz%29%20%2F%201%20%3D%2012MHz%0D%0A%20%20%20%20clock_configure%28clk_ref%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20CLOCKS_CLK_REF_CTRL_SRC_VALUE_XOSC_CLKSRC%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%2C%20%20%2F%2F%20No%20aux%20mux%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2012%20%2A%20MHZ%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2012%20%2A%20MHZ%29%3B%0D%0A%0D%0A%20%20%20%20%2F%2F%20CLK%20SYS%20%3D%20PLL%20SYS%20%28125MHz%29%20%2F%201%20%3D%20125MHz%0D%0A%20%20%20%20clock_configure%28clk_sys%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20CLOCKS_CLK_SYS_CTRL_SRC_VALUE_CLKSRC_CLK_SYS_AUX%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20CLOCKS_CLK_SYS_CTRL_AUXSRC_VALUE_CLKSRC_PLL_SYS%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20freq%2C%20freq%29%3B%0D%0A%0D%0A%20%20%20%20clock_configure%28clk_peri%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%2C%20%20%2F%2F%20Only%20AUX%20mux%20on%20ADC%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2048%20%2A%20MHZ%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2048%20%2A%20MHZ%29%3B%0D%0A%20%20%7D%0D%0A%7D%0D%0Abool%20check_sys_clock_khz%28uint32_t%20freq_khz%2C%20uint%20%2Avco_out%2C%20uint%20%2Apostdiv1_out%2C%20uint%20%2Apostdiv_out%29%20%7B%0D%0A%20%20uint%20crystal_freq_khz%20%3D%20clock_get_hz%28clk_ref%29%20%2F%201000%3B%0D%0A%20%20for%20%28uint%20fbdiv%20%3D%20320%3B%20fbdiv%20%3E%3D%2016%3B%20fbdiv--%29%20%7B%0D%0A%20%20%20%20uint%20vco%20%3D%20fbdiv%20%2A%20crystal_freq_khz%3B%0D%0A%20%20%20%20if%20%28vco%20%3C%20400000%20%7C%7C%20vco%20%3E%201600000%29%20continue%3B%0D%0A%20%20%20%20for%20%28uint%20postdiv1%20%3D%207%3B%20postdiv1%20%3E%3D%201%3B%20postdiv1--%29%20%7B%0D%0A%20%20%20%20%20%20for%20%28uint%20postdiv2%20%3D%20postdiv1%3B%20postdiv2%20%3E%3D%201%3B%20postdiv2--%29%20%7B%0D%0A%20%20%20%20%20%20%20%20uint%20out%20%3D%20vco%20%2F%20%28postdiv1%20%2A%20postdiv2%29%3B%0D%0A%20%20%20%20%20%20%20%20if%20%28out%20%3D%3D%20freq_khz%20%26%26%20%21%28vco%20%25%20%28postdiv1%20%2A%20postdiv2%29%29%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%2Avco_out%20%3D%20vco%20%2A%201000%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%2Apostdiv1_out%20%3D%20postdiv1%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%2Apostdiv_out%20%3D%20postdiv2%3B%0D%0A%20%20%20%20%20%20%20%20%20%20return%20true%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%20%20%7D%0D%0A%20%20return%20false%3B%0D%0A%7D%0D%0Astatic%20inline%20bool%20set_sys_clock_khz%28uint32_t%20freq_khz%2C%20bool%20required%29%20%7B%0D%0A%20%20uint%20vco%2C%20postdiv1%2C%20postdiv2%3B%0D%0A%20%20if%20%28check_sys_clock_khz%28freq_khz%2C%20%26vco%2C%20%26postdiv1%2C%20%26postdiv2%29%29%20%7B%0D%0A%20%20%20%20set_sys_clock_pll%28vco%2C%20postdiv1%2C%20postdiv2%29%3B%0D%0A%20%20%20%20return%20true%3B%0D%0A%20%20%7D%20else%20if%20%28required%29%20%7B%0D%0A%20%20%20%20panic%28%22System%20clock%20of%20%25u%20kHz%20cannot%20be%20exactly%20achieved%22%2C%20freq_khz%29%3B%0D%0A%20%20%7D%0D%0A%20%20return%20false%3B%0D%0A%7D%0D%0A%0D%0A%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0D%0A%0D%0Avoid%20USBMSD%3A%3Abegin%28%29%0D%0A%7B%0D%0A%20%20int%20err%20%3D%20getFileSystem%28%29.mount%28%26bd%29%3B%0D%0A%20%20if%20%28err%29%20%7B%0D%0A%20%20%20%2F%2FString%20FN%20%3D%20getFileSystem%28%29.getName%28%29%3B%0D%0A%20%20%20Serial.println%28%22%20filesystem%20mount%20failed.%20Try%20to%20reformat%20device...%22%29%3B%0D%0A%20%20%20%20err%20%3D%20getFileSystem%28%29.reformat%28%26bd%29%3B%0D%0A%20%20%7D%0D%0A%20%20if%20%28err%29%20%7B%0D%0A%20%20%20%20Serial.println%28%22Error%3A%20Unable%20to%20format%2Fmount%20the%20device.%22%29%3B%0D%0A%20%20%20%20while%281%29%3B%0D%0A%20%20%7D%0D%0A%7D%0D%0A%0D%0Ambed%3A%3AFATFileSystem%20%26USBMSD%3A%3AgetFileSystem%28%29%0D%0A%7B%0D%0A%20%20static%20mbed%3A%3AFATFileSystem%20fs%28%22root%22%29%3B%0D%0A%20%20return%20fs%3B%0D%0A%7D%0D%0A%0D%0A%2F%2A%0D%0A%20%2A%20PWM%20Interrupt%20Handler%20which%20outputs%20PWM%20level%20and%20advances%20the%20%0D%0A%20%2A%20current%20sample.%20%0D%0A%20%2A%20%0D%0A%20%2A%20We%20repeat%20the%20same%20value%20for%208%20cycles%20this%20means%20sample%20rate%20etc%0D%0A%20%2A%20adjust%20by%20factor%20of%208%20%20%20%28this%20is%20what%20bitshifting%20%3C%3C3%20is%20doing%29%0D%0A%20%2A%20%0D%0A%20%2A%2F%0D%0A%20%0D%0Avoid%20pwm_interrupt_handler%28%29%20%7B%0D%0A%20%20%20%20pwm_clear_irq%28pwm_gpio_to_slice_num%28AUDIO_PIN%29%29%3B%0D%0A%20%20%20%20if%20%28TriggerAudio%29%20%7B%0D%0A%20%20%20%20%20%20if%20%28wav_position%20%3C%20%28ChunkSize%3C%3C3%29%20-%201%29%20%7B%20%0D%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20set%20pwm%20level%20%0D%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20allow%20the%20pwm%20value%20to%20repeat%20for%208%20cycles%20this%20is%20%3E%3E3%20%0D%0A%20%20%20%20%20%20%20%20%20%20pwm_set_gpio_level%28AUDIO_PIN%2C%20WAV_DATA%5Bwav_position%3E%3E3%5D%29%3B%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20wav_position%2B%2B%3B%0D%0A%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20reset%20to%20start%0D%0A%20%20%20%20%20%20%20%20%20%20wav_position%20%3D%200%3B%0D%0A%20%20%20%20%20%20%20%20%20%20TriggerAudio%20%3D%20false%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0A%0D%0A%20%20%0D%0Avoid%20core1_entry%28%29%20%7B%0D%0A%0D%0A%20%20%20%20%0D%0A%20%20while%20%281%29%20%7B%0D%0A%20%20%20%20%2F%2F%20Function%20pointer%20is%20passed%20to%20us%20via%20the%20FIFO%0D%0A%20%20%20%20%2F%2F%20We%20have%20one%20incoming%20int32_t%20as%20a%20parameter%2C%20and%20will%20provide%20an%0D%0A%20%20%20%20%2F%2F%20int32_t%20return%20value%20by%20simply%20pushing%20it%20back%20on%20the%20FIFO%0D%0A%20%20%20%20%2F%2F%20which%20also%20indicates%20the%20result%20is%20ready.%0D%0A%0D%0A%20%20%20%20%2F%2F%20put%20your%20main%20code%20here%2C%20to%20run%20repeatedly%3A%0D%0A%20%20%20%20c1_value%20%3D%20sonar.readSonar%28%29%3B%0D%0A%20%20%20%20%0D%0A%20%20%20%20%2F%2F%20Sanity%20check%20on%20values%20received%0D%0A%20%20%20%20if%20%28c1_value%20%3E%200.0%20%26%26%20c1_value%20%3C%20300.0%29%20%7B%0D%0A%0D%0A%20%20%20%20%20%20if%20%28c1_prev%20%3E%200.0%20%26%26%20c1_value%20%3C%20TRIG_DIST%20%26%26%20c1_prev%20%3C%20TRIG_DIST%29%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20%28%21redTrigger%20%26%26%20%21LED_timer%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20redTrigger%20%3D%20true%3B%0D%0A%20%20%20%20%20%20%20%20%20%20digitalWrite%28LEDGREENPIN%2C%20LOW%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20digitalWrite%28LEDREDPIN%2C%20HIGH%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20%28greenTrigger%29%20greenTrigger%20%3D%20false%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Send%20results%20back%20to%20core%200%0D%0A%20%20%20%20%20%20%20%20%20%20if%20%28multicore_fifo_wready%28%29%29%20multicore_fifo_push_blocking%281%29%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20else%20if%20%28c1_prev%20%3E%200.0%20%26%26%20c1_value%20%3E%20%28TRIG_DIST%2B20.0%29%20%26%26%20c1_prev%20%3E%20%28TRIG_DIST%2B20.0%29%29%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20%28redTrigger%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20redTrigger%20%3D%20false%3B%0D%0A%20%20%20%20%20%20%20%20%20%20digitalWrite%28LEDREDPIN%2C%20LOW%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20digitalWrite%28LEDGREENPIN%2C%20HIGH%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20greenTrigger%20%3D%20true%3B%0D%0A%20%20%20%20%20%20%20%20%20%20LED_timer%20%3D%20millis%28%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20%28multicore_fifo_wready%28%29%29%20multicore_fifo_push_blocking%282%29%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20%28greenTrigger%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%28millis%28%29%20-%20LED_timer%29%20%3E%202000%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20greenTrigger%20%3D%20false%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20digitalWrite%28LEDGREENPIN%2C%20LOW%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20LED_timer%20%3D%200%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28multicore_fifo_wready%28%29%29%20multicore_fifo_push_blocking%283%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20c1_prev%20%3D%20c1_value%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20else%20if%20%28c1_value%20%3E%20300.0%29%20%7B%0D%0A%20%20%20%20%20%20if%20%28LED_timer%20%26%26%20%28millis%28%29%20-%20LED_timer%29%20%3E%202000%29%20%7B%0D%0A%20%20%20%20%20%20%20%20LED_timer%20%3D%200%3B%0D%0A%20%20%20%20%20%20%20%20if%20%28multicore_fifo_wready%28%29%29%20multicore_fifo_push_blocking%280%29%3B%0D%0A%20%20%20%20%20%20%20%20greenTrigger%20%3D%20false%3B%0D%0A%20%20%20%20%20%20%20%20redTrigger%20%3D%20false%3B%0D%0A%20%20%20%20%20%20%20%20digitalWrite%28LEDREDPIN%2C%20LOW%29%3B%0D%0A%20%20%20%20%20%20%20%20digitalWrite%28LEDGREENPIN%2C%20LOW%29%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%20%20%7D%20%0D%0A%7D%0D%0A%0D%0A%0D%0Avoid%20setup%28%29%20%7B%0D%0A%20%0D%0A%20%20set_sys_clock_khz%28176000%2C%20true%29%3B%0D%0A%0D%0A%20%20%2F%2F%20set%20the%20digital%20pin%20as%20output%3A%0D%0A%20%20pinMode%28LEDREDPIN%2C%20OUTPUT%29%3B%0D%0A%20%20pinMode%28LEDGREENPIN%2C%20OUTPUT%29%3B%0D%0A%0D%0A%20%20Serial.begin%28115200%29%3B%0D%0A%20%20delay%28500%29%3B%0D%0A%20%20%2F%2Fwhile%20%28%21Serial%29%20%7B%3B%3B%7D%0D%0A%0D%0A%20%20%2F%2Ftimer%20%3D%20millis%28%29%3B%0D%0A%0D%0A%20%20multicore_launch_core1%28core1_entry%29%3B%0D%0A%20%20%0D%0A%20%20MassStorage.begin%28%29%3B%0D%0A%0D%0A%20%20Serial.println%28%22%5Cr%5CnPico%20PIO%20Multicore%20SonicRanger%20AudioWAV%20Playback%20demo%5Cr%5Cn%22%29%3B%0D%0A%20%20%0D%0A%20%20%2F%2F%20Check%20that%20the%20two%20audio%20files%20exist%0D%0A%20%20f%20%3D%20fopen%28fname1%2C%20%22r%22%29%3B%0D%0A%20%20if%20%28f%20%21%3D%20nullptr%29%20%7B%0D%0A%20%20%20%20fclose%28f%29%3B%0D%0A%20%20%20%20f%20%3D%20fopen%28fname2%2C%20%22r%22%29%3B%0D%0A%20%20%20%20if%20%28f%20%21%3D%20nullptr%29%20%7B%0D%0A%20%20%20%20%20%20fclose%28f%29%3B%0D%0A%20%20%20%20%20%20gpio_set_function%28AUDIO_PIN%2C%20GPIO_FUNC_PWM%29%3B%0D%0A%20%20%20%20%20%20int%20audio_pin_slice%20%3D%20pwm_gpio_to_slice_num%28AUDIO_PIN%29%3B%0D%0A%20%20%0D%0A%20%20%20%20%20%20%2F%2F%20Setup%20PWM%20interrupt%20to%20fire%20when%20PWM%20cycle%20is%20complete%0D%0A%20%20%20%20%20%20pwm_clear_irq%28audio_pin_slice%29%3B%0D%0A%20%20%20%20%20%20pwm_set_irq_enabled%28audio_pin_slice%2C%20true%29%3B%0D%0A%20%20%20%20%20%20%2F%2F%20set%20the%20handle%20function%20above%0D%0A%20%20%20%20%20%20irq_set_exclusive_handler%28PWM_IRQ_WRAP%2C%20pwm_interrupt_handler%29%3B%20%0D%0A%20%20%20%20%20%20irq_set_enabled%28PWM_IRQ_WRAP%2C%20true%29%3B%0D%0A%20%20%0D%0A%20%20%20%20%20%20%2F%2F%20Setup%20PWM%20for%20audio%20output%0D%0A%20%20%20%20%20%20pwm_config%20config%20%3D%20pwm_get_default_config%28%29%3B%0D%0A%20%20%20%20%20%20pwm_config_set_clkdiv%28%26config%2C%208.0f%29%3B%20%0D%0A%20%20%20%20%20%20pwm_config_set_wrap%28%26config%2C%20250%29%3B%20%0D%0A%20%20%20%20%20%20pwm_init%28audio_pin_slice%2C%20%26config%2C%20true%29%3B%0D%0A%20%20%0D%0A%20%20%20%20%20%20pwm_set_gpio_level%28AUDIO_PIN%2C%200%29%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20Serial.println%28%22Sound2%20file%20not%20found%22%29%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%7D%0D%0A%20%20else%20%7B%0D%0A%20%20%20%20Serial.println%28%22Sound1%20file%20not%20found%22%29%3B%0D%0A%20%20%7D%0D%0A%7D%0D%0A%0D%0Avoid%20loop%28%29%20%7B%0D%0A%0D%0A%20%20if%20%28multicore_fifo_rvalid%28%29%29%20%7B%0D%0A%20%20%20%20range_mode%20%3D%20multicore_fifo_pop_blocking%28%29%3B%0D%0A%20%20%20%20Serial.println%28range_mode%29%3B%0D%0A%20%20%7D%0D%0A%20%20if%20%28%21TriggerAudio%20%26%26%20range_mode%20%3D%3D%201%29%20%7B%0D%0A%20%20%20%20if%20%28readContents%28fname1%29%29%20%7B%0D%0A%20%20%20%20%20%20TriggerThankyou%20%3D%20true%3B%0D%0A%20%20%20%20%20%20TriggerAudio%20%3D%20true%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%7D%0D%0A%20%20else%20if%20%28%21TriggerAudio%20%26%26%20%28range_mode%20%3D%3D%202%20%7C%7C%20TriggerThankyou%29%29%20%7B%0D%0A%20%20%20%20if%20%28readContents%28fname2%29%29%20%7B%0D%0A%20%20%20%20%20%20TriggerThankyou%20%3D%20false%3B%20%0D%0A%20%20%20%20%20%20TriggerAudio%20%3D%20true%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%7D%0D%0A%0D%0A%20%20%0D%0A%0D%0A%20%20%20%20%0D%0A%7D%0D%0A%0D%0Abool%20readContents%28const%20char%20%2Afname%29%20%7B%0D%0A%20%20%20%20wav_hdr%20wavHeader%3B%0D%0A%20%20%20%20int%20headerSize%20%3D%20sizeof%28wav_hdr%29%3B%0D%0A%20%20%20%20%0D%0A%20%20%20%20f%20%3D%20fopen%28fname%2C%20%22r%22%29%3B%0D%0A%20%20%20%20if%20%28f%20%21%3D%20nullptr%29%20%7B%0D%0A%20%20%20%20%20%20size_t%20bytesRead%20%3D%20fread%28%26wavHeader%2C%201%2C%20headerSize%2C%20f%29%3B%0D%0A%20%20%20%20%20%20Serial.print%28%22Header%20Read%20%22%29%3B%20Serial.print%28bytesRead%29%3B%20Serial.println%28%22%20bytes.%22%29%3B%0D%0A%20%20%20%20%20%20if%20%28bytesRead%20%3E%200%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%2F%2FRead%20the%20data%0D%0A%20%20%20%20%20%20%20%20uint16_t%20bytesPerSample%20%3D%20wavHeader.bitsPerSample%20%2F%208%3B%20%20%20%20%20%20%2F%2FNumber%20%20%20%20%20of%20bytes%20per%20sample%0D%0A%20%20%20%20%20%20%20%20uint64_t%20numSamples%20%3D%20wavHeader.ChunkSize%20%2F%20bytesPerSample%3B%20%2F%2FHow%20many%20samples%20are%20in%20the%20wav%20file%3F%0D%0A%20%20%20%20%20%20%20%20%2F%2Fstatic%20const%20uint16_t%20BUFFER_SIZE%20%3D%204096%3B%0D%0A%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%2F%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%0D%0A%20%20%20%20%20%20%20%20Serial.println%28%29%3B%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22RIFF%20header%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%22%29%3B%20Serial.print%28%28char%29wavHeader.RIFF%5B0%5D%29%3B%20Serial.print%28%28char%29wavHeader.RIFF%5B1%5D%29%3B%20Serial.print%28%28char%29wavHeader.RIFF%5B2%5D%29%3B%20Serial.println%28%28char%29wavHeader.RIFF%5B3%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22Chunk%20Size%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%22%29%3B%20Serial.print%28wavHeader.ChunkSize%29%3B%20Serial.print%28%22%20TOTAL%3A%20%22%29%3B%20Serial.print%28wavHeader.ChunkSize%2B8%29%3B%20%20Serial.print%28%22%20DATA%3A%20%22%29%3B%20Serial.println%28wavHeader.ChunkSize-%2836%20%2B%20wavHeader.Subchunk2Size%29-8%29%3B%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22WAVE%20header%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%22%29%3B%20Serial.print%28%28char%29wavHeader.WAVE%5B0%5D%29%3B%20Serial.print%28%28char%29wavHeader.WAVE%5B1%5D%29%3B%20Serial.print%28%28char%29wavHeader.WAVE%5B2%5D%29%3B%20Serial.println%28%28char%29wavHeader.WAVE%5B3%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22Subchunk1%20ID%20%28fmt%29%20%20%20%20%20%20%20%20%20%3A%22%29%3B%20Serial.print%28%28char%29wavHeader.fmt%5B0%5D%29%3B%20Serial.print%28%28char%29wavHeader.fmt%5B1%5D%29%3B%20Serial.print%28%28char%29wavHeader.fmt%5B2%5D%29%3B%20Serial.println%28%28char%29wavHeader.fmt%5B3%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22Subchunk1%20size%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%22%29%3B%20Serial.print%28wavHeader.Subchunk1Size%29%3B%20Serial.println%28wavHeader.Subchunk1Size%3D%3D16%3F%22%20PCM%22%3A%22%22%29%3B%0D%0A%0D%0A%20%20%20%20%20%20%20%20%2F%2F%20Display%20the%20sampling%20Rate%20from%20the%20header%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22Audio%20Format%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%22%29%3B%20Serial.println%28wavHeader.AudioFormat%3D%3D1%3F%22PCM%22%3A%28wavHeader.AudioFormat%3D%3D6%3F%22mulaw%22%3A%28wavHeader.AudioFormat%3D%3D7%3F%22alaw%22%3A%28wavHeader.AudioFormat%3D%3D257%3F%22IBM%20Mu-Law%22%3A%28wavHeader.AudioFormat%3D%3D258%3F%22IBM%20A-Law%22%3A%22ADPCM%22%29%29%29%29%29%3B%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22Number%20of%20channels%20%20%20%20%20%20%20%20%20%3A%22%29%3B%20Serial.println%28wavHeader.NumOfChan%3D%3D1%3F%22Mono%22%3A%28wavHeader.NumOfChan%3D%3D2%3F%22Mono%22%3A%22Other%22%29%29%3B%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22Sampling%20Rate%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%22%29%3B%20Serial.println%28wavHeader.SamplesPerSec%29%3B%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22Number%20of%20bytes%20per%20second%20%3A%22%29%3B%20Serial.println%28wavHeader.bytesPerSec%29%3B%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22Block%20align%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%22%29%3B%20Serial.print%28wavHeader.blockAlign%29%3B%20Serial.print%28%22%20validate%3A%20%22%29%3B%20Serial.println%28bytesPerSample%20%2A%20wavHeader.NumOfChan%29%3B%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22Number%20of%20bits%20per%20sample%20%20%3A%22%29%3B%20Serial.println%28wavHeader.bitsPerSample%29%3B%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22Data%20length%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%22%29%3B%20Serial.println%28wavHeader.Subchunk2Size%29%3B%0D%0A%20%20%20%20%20%20%20%20%2F%2F%20Audio%20format%201%3DPCM%2C6%3Dmulaw%2C7%3Dalaw%2C%20257%3DIBM%20Mu-Law%2C%20258%3DIBM%20A-Law%2C%20259%3DADPCM%0D%0A%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22Data%20string%20%28Subchunk2%20ID%29%20%3A%22%29%3B%20Serial.print%28%28char%29wavHeader.Subchunk2ID%5B0%5D%29%3B%20Serial.print%28%28char%29wavHeader.Subchunk2ID%5B1%5D%29%3B%20Serial.print%28%28char%29wavHeader.Subchunk2ID%5B2%5D%29%3B%20Serial.println%28%28char%29wavHeader.Subchunk2ID%5B3%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20Serial.print%28%22Subchunk2%20size%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%22%29%3B%20Serial.print%28wavHeader.Subchunk2Size%29%3B%20Serial.print%28%22%20validate%3A%20%22%29%3B%20Serial.println%28numSamples%20%2A%20wavHeader.NumOfChan%20%2A%20bytesPerSample%29%3B%0D%0A%20%20%20%20%20%20%20%20%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2A%2F%0D%0A%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20if%20%28memcmp%28%28char%2A%29wavHeader.Subchunk2ID%2C%22LIST%22%2C4%29%20%3D%3D%200%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20Serial.println%28%22List%20chunk%20%28of%20a%20RIFF%20file%29%3A%22%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20uint8_t%20ListType%5BwavHeader.Subchunk2Size%5D%3B%20%20%20%20%20%20%20%20%2F%2F%20RIFF%20Header%20Magic%20header%0D%0A%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20bytesRead%20%3D%20fread%28%26ListType%2C%201%2C%20wavHeader.Subchunk2Size%2C%20f%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20bytesRead%20%3E%200%20%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20Serial.print%28%22%20---%20List%20type%20ID%20%3A%22%29%3B%20Serial.print%28%28char%29ListType%5B0%5D%29%3B%20Serial.print%28%28char%29ListType%5B1%5D%29%3B%20Serial.print%28%28char%29ListType%5B2%5D%29%3B%20Serial.println%28%28char%29ListType%5B3%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28memcmp%28%28char%2A%29ListType%2C%22INFO%22%2C4%29%20%3D%3D%200%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20INFO%20tag%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.print%28%22%20---%20---%20INFO1%20type%20ID%20%3A%22%29%3B%20Serial.print%28%28char%29ListType%5B4%5D%29%3B%20Serial.print%28%28char%29ListType%5B5%5D%29%3B%20Serial.print%28%28char%29ListType%5B6%5D%29%3B%20Serial.println%28%28char%29ListType%5B7%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20uint8_t%20sizeTxt%20%3D%20%28ListType%5B11%5D%20%3C%3C%2024%29%20%7C%20%28ListType%5B10%5D%20%3C%3C%2016%29%20%7C%20%28ListType%5B9%5D%20%3C%3C%208%29%20%7C%20ListType%5B8%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.print%28%22%20---%20---%20SizeD%20%3A%22%29%3B%20Serial.print%28sizeTxt%29%3B%20Serial.print%28%22%20Validate%3A%20%22%29%3B%20Serial.println%28wavHeader.Subchunk2Size%20-%20sizeTxt%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20%28uint8_t%20x%20%3D%2012%3B%20x%20%3C%20wavHeader.Subchunk2Size%3B%20x%2B%2B%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28ListType%5Bx%5D%20%3E%3D%2032%20%26%26%20ListType%5Bx%5D%20%3C%3D%20126%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.print%28%28char%29ListType%5Bx%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28ListType%5Bx%5D%20%3E%200%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.print%28%220x%22%29%3B%20Serial.print%28ListType%5Bx%5D%2CHEX%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.print%28%22%20%22%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20Serial.println%28%22%22%29%3B%0D%0A%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Checking%20for%20data%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20bytesRead%20%3D%20fread%28%26ListType%2C%201%2C%204%2C%20f%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28bytesRead%20%3E%200%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.print%28%22Data%20string%20%28Subchunk3%20ID%29%20%3A%22%29%3B%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20%28uint8_t%20x%20%3D%200%3B%20x%20%3C%204%3B%20x%2B%2B%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28ListType%5Bx%5D%20%3E%3D%2032%20%26%26%20ListType%5Bx%5D%20%3C%3D%20126%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.print%28%28char%29ListType%5Bx%5D%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28ListType%5Bx%5D%20%3E%200%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.print%28%220x%22%29%3B%20Serial.print%28ListType%5Bx%5D%2CHEX%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.println%28%22%22%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20bytesRead%20%3D%20fread%28%26ChunkSize%2C%201%2C%204%2C%20f%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28bytesRead%20%3E%200%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.print%28%22Subchunk3%20size%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%22%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.print%28ChunkSize%29%3B%20Serial.print%28%22%20validate%3A%20%22%29%3B%20Serial.println%288%2BnumSamples%20%2A%20wavHeader.NumOfChan%20%2A%20bytesPerSample%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20ChunkSize%20%3D%20wavHeader.Subchunk2Size%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%20%20%20%20WAV_DATA%20%3D%20new%20uint8_t%5BChunkSize%5D%3B%0D%0A%0D%0A%20%20%20%20%20%20%20%20%2F%2Fint8_t%2A%20buffer%20%3D%20new%20int8_t%5BBUFFER_SIZE%5D%3B%0D%0A%20%20%20%20%20%20%20%20bytesRead%20%3D%20fread%28WAV_DATA%2C%20sizeof%20WAV_DATA%5B0%5D%2C%20ChunkSize%20%2F%20%28sizeof%20WAV_DATA%5B0%5D%29%2C%20f%29%3B%0D%0A%20%20%20%20%20%20%20%20if%20%28bytesRead%29%0D%0A%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20Serial.println%28%22Sound%20File%20Data%20Read%20%22%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20int%20fileSize%20%3D%200%3B%0D%0A%20%20%20%20%20%20%20%20%20%20fseek%28f%2C%200%2C%20SEEK_END%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20fileSize%20%3D%20ftell%28f%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20fseek%28f%2C%200%2C%20SEEK_SET%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20Serial.print%28%22File%20size%20is%3A%20%22%29%3B%20Serial.print%28fileSize%29%3B%20Serial.println%28%22%20bytes.%22%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%20%20fclose%28f%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%2F%2Fdelete%20%5B%5D%20buffer%3B%0D%0A%20%20%20%20%20%20%20%20%2F%2Fbuffer%20%3D%20nullptr%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20Serial.println%28%22File%20not%20found%22%29%3B%0D%0A%20%20%20%20%20%20return%20false%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20%0D%0A%20%20%20%20return%20true%3B%0D%0A%7D]&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I am using two audio files this time.&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " src="/resized-image/__size/1280x720/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-a65f2355-1c6b-4908-b210-adcc7eec2df1/Screenshot-from-2022_2D00_06_2D00_18-18_2D00_26_2D00_13.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The audio files I am using originate from &lt;a href="https://freesound.org"&gt;freesound.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sound 1: &lt;a href="https://freesound.org/people/AmeAngelofSin/sounds/165596/"&gt;https://freesound.org/people/AmeAngelofSin/sounds/165596/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sound 1 is licensed under &lt;a rel="nofollow" target="_blank" href="https://creativecommons.org/licenses/by/4.0/"&gt;creativecommons.org/.../&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sound 2: &lt;a href="https://freesound.org/people/DjHamSammich/sounds/624079/"&gt;https://freesound.org/people/DjHamSammich/sounds/624079/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sound 2 is licensed under &lt;a rel="nofollow" target="_blank" href="https://creativecommons.org/publicdomain/zero/1.0/"&gt;creativecommons.org/.../&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Here is a video demo. Basically if you move too close to the ultrasonic sensor it triggers sound1 and as you retreat it triggers sound2.&lt;/p&gt;
&lt;p&gt;Apologies for the sound quality as it appears that the Ultrasonic Range Finder echos were being detected by my mobile phone&amp;#39;s microphone.&lt;/p&gt;
&lt;p&gt;[View:/cfs-file/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-a65f2355-1c6b-4908-b210-adcc7eec2df1/pico_5F00_pwmaudioranger.mp4:640:360]&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=23732&amp;AppID=367&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: Playing audio WAV files from a Pico emulated USB Mass Storage Device</title><link>https://community.element14.com/challenges-projects/design-challenges/pi-fest/b/blog/posts/playing-wav-audio-files-from-usb-folder</link><pubDate>Mon, 06 Jun 2022 19:27:45 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:a65f2355-1c6b-4908-b210-adcc7eec2df1</guid><dc:creator>BigG</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Had to be done... the Pico doorbell...&lt;/p&gt;
&lt;p&gt;[View:/cfs-file/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-a65f2355-1c6b-4908-b210-adcc7eec2df1/pico_5F00_pwmaudiodoorbell.mp4:640:360]&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=23732&amp;AppID=367&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: Playing audio WAV files from a Pico emulated USB Mass Storage Device</title><link>https://community.element14.com/challenges-projects/design-challenges/pi-fest/b/blog/posts/playing-wav-audio-files-from-usb-folder</link><pubDate>Mon, 06 Jun 2022 14:40:43 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:a65f2355-1c6b-4908-b210-adcc7eec2df1</guid><dc:creator>scottiebabe</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;That is very cool!&amp;nbsp;Your noise sounds very similar to HD audio&amp;nbsp;[emoticon:96191f836ed544d089a3a9758ea6d76a].&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=23732&amp;AppID=367&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item></channel></rss>