<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Serenesynth Team</title>
    <description>The latest articles on DEV Community by Serenesynth Team (@serenesynth).</description>
    <link>https://dev.to/serenesynth</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4109359%2F9e7c8b6c-341b-4cd9-a3a5-7acd1da2d95e.jpeg</url>
      <title>DEV Community: Serenesynth Team</title>
      <link>https://dev.to/serenesynth</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/serenesynth"/>
    <language>en</language>
    <item>
      <title>I Built a Binaural Beat Generator — Then Proved It With a Live FFT Spectrum Analyzer</title>
      <dc:creator>Serenesynth Team</dc:creator>
      <pubDate>Fri, 04 Sep 2026 09:55:25 +0000</pubDate>
      <link>https://dev.to/serenesynth/i-built-a-binaural-beat-generator-then-proved-it-with-a-live-fft-spectrum-analyzer-2nn2</link>
      <guid>https://dev.to/serenesynth/i-built-a-binaural-beat-generator-then-proved-it-with-a-live-fft-spectrum-analyzer-2nn2</guid>
      <description>&lt;p&gt;The "frequency healing" corner of the internet runs on faith. Apps ship MP3s labeled "40Hz gamma" and ask you to believe it. I'm a life scientist who builds web tools, and I couldn't ship that. So I built SereneSynth, a browser-based binaural beat and noise generator — and then I built a live spectrum analyzer into the page so anyone can audit the output in their own browser.&lt;/p&gt;

&lt;p&gt;This is the engineering write-up: the Web Audio graph, the FFT gotcha that almost made me publish wrong numbers, and how I cross-verified everything in Audacity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honesty constraint first
&lt;/h2&gt;

&lt;p&gt;A binaural beat is not a tone in the air. Play 200 Hz into the left ear and 240 Hz into the right, and the listener's superior olivary complex computes the 40 Hz difference. A microphone — or a mono spectrum analyzer — will never show a 40 Hz peak. So the only honest thing a generator can prove is its carriers and its spectral slope. That is exactly what we measure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5rg9jqfry7newp1ksm97.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5rg9jqfry7newp1ksm97.png" alt=" " width="800" height="618"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The synthesis graph
&lt;/h2&gt;

&lt;p&gt;Two sine oscillators, hard-panned with StereoPannerNode, summed into a master GainNode, tapped by an AnalyserNode before the destination — the analyzer observes exactly what the headphones receive. Settings that matter: fftSize 16384, smoothingTimeConstant 0.8.&lt;/p&gt;

&lt;h2&gt;
  
  
  The FFT gotcha that almost made me ship garbage
&lt;/h2&gt;

&lt;p&gt;My first version used fftSize 1024: one fat bump near 220 Hz instead of two peaks. Bin width = 44100 / 1024 ≈ 43 Hz, and my carriers are 40 Hz apart — same bin, merged. At fftSize 16384 the bin width drops to ≈ 2.7 Hz and the carriers resolve as razor-sharp spikes at 200.0 and 240.0 Hz. Lesson: FFT size is the magnifying glass. If a "frequency proof" doesn't state its FFT size, ask.&lt;/p&gt;

&lt;p&gt;The widget renders a log axis (20–1000 Hz) because a linear axis wastes 90% of the canvas, and peak detection labels the top bins in the 100–500 Hz range live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bit-exact, downloadable verification
&lt;/h2&gt;

&lt;p&gt;The page also renders 10-second stereo WAVs via Offline Audio Context (16-bit PCM, 44.1 kHz): same graph, offline render, RIFF encode. No lossy compression between the engine and the evidence.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmp91vvmbo40cld2wly59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmp91vvmbo40cld2wly59.png" alt=" " width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-check: two instruments, same answer
&lt;/h2&gt;

&lt;p&gt;Opened the exported WAVs in Audacity (Analyze → Plot Spectrum, FFT 16,384, Hann window):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;40 Hz preset: two spikes at 200.0 / 240.0 Hz&lt;/li&gt;
&lt;li&gt;432 Hz preset: single spike at 432.0 Hz, no harmonics&lt;/li&gt;
&lt;li&gt;Brown noise: continuous ≈ -6 dB/octave rolloff on a log axis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foes9lynbcwx8ysq4tgis.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foes9lynbcwx8ysq4tgis.png" alt=" " width="445" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Browser analyzer and desktop DAW agree. The proof is re-runnable, not rhetorical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Audit it yourself
&lt;/h2&gt;

&lt;p&gt;Live analyzer + WAV downloads: &lt;a href="https://serenesynth.com/proof-lab" rel="noopener noreferrer"&gt;serenesynth.com/proof-lab&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The generator: &lt;a href="https://serenesynth.com/binaural-beat-generator" rel="noopener noreferrer"&gt;serenesynth.com/binaural-beat-generator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Methodology + figures: &lt;a href="https://github.com/greenwisdom555/serenesynth-proof-lab-methodology" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No mysticism. Just math.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
