<?xml version="1.0" encoding="UTF-8" ?>
    <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
        <channel>
            <title>SPEKTRUM LOG</title>
            <link>https://spektrum.works</link>
            <description>SPEKTRUM LOG</description>
            <language>en</language>
            <lastBuildDate>Fri, 03 Apr 2026 22:00:00 GMT</lastBuildDate>
            <atom:link href="https://spektrum.works/rss.xml" rel="self" type="application/rss+xml" />

            
            <item>
                <title>ET-01-ASG</title>
                <link>https://spektrum.works/log/et-01-asg</link>
                <guid isPermaLink="true">https://spektrum.works/log/et-01-asg</guid>
                <dc:creator>Spektrum</dc:creator>

                <description><![CDATA[<p>Ambient Sound Generator. A listening device (or, a jukebox) for ambient soundscapes.</p>
<p>ET-01 <a href="#fn1" class="footnote-ref-circle" id="fnref1" role="doc-noteref" style="--fg:white;--bg:bl...]]></description>
                <content:encoded><![CDATA[<p>Ambient Sound Generator. A listening device (or, a jukebox) for ambient soundscapes.</p>
<p>ET-01 <a href="#fn1" class="footnote-ref-circle" id="fnref1" role="doc-noteref" style="--fg:white;--bg:blue"><b>1</b></a> ASG is a hardware-driven audio system in which a grid of physical switches maps directly to audio behaviors.
The interaction model is state-based: the combination of switch positions produces a bitmask that resolves to a single sound, or channel.
The 6x4 switch grid gives the machine a theoretical capacity of ~16.7 million sounds.</p>
<p>There is no display. Instead, the system relies on a single status LED and text-to-speech for user feedback.</p>
<div class="bg-white stack-layout link">
    	<div class="">
            <video loop="true" autoplay="true" muted playsinline class="img-bottom video_toggleMute">
                <source src="/static/videos/et-01-asg-demo.mp4" type="video/mp4">
            </video>
		</div>
        <div class="desc">
        	<span class="rounded-button pointerEventsNone bg-white fg-black">Sound On/Off</span>
        </div>
	</div>
<div class="byline"></div>
<h4>Hardware</h4>
<ul>
<li>Switch grid (6×4 layout → 24 inputs + 4 aux switches)</li>
<li>Raspberry Pi (3A+)</li>
<li>MCP23017 I/O expander</li>
<li>Internal power supply / step down module.</li>
</ul>
<br />
<img 
        srcset="/static/images/log/et01-asg-mess-01-1000.webp 1000w, /static/images/log/et01-asg-mess-01-1400.webp 1400w, /static/images/log/et01-asg-mess-01-2000.webp 2000w, /static/images/log/et01-asg-mess-01-2400.webp 2400w" 
        src="/static/images/log/et01-asg-mess-01-1000.jpg" 
        class="img-fs-center" alt=""
        />
<div class="byline">Prototyping wiring mess.</div>
<h4>Software</h4>
<p>The core system is written in Python. Audio playback is handled by mpv <a href="#fn2" class="footnote-ref-circle" id="fnref2" role="doc-noteref" style="--fg:white;--bg:blue"><b>2</b></a>, while sound effects and text-to-speech (eSpeak <a href="#fn3" class="footnote-ref-circle" id="fnref3" role="doc-noteref" style="--fg:white;--bg:blue"><b>3</b></a>) run alongside it, allowing the system to speak, react, and provide feedback. A custom control layer manages buffering, transitions / audio ducking, and failure states. An admin layer enables remote control and debugging over SSH. Data is stored in a simple SQLite database, and a set of Python utility scripts helps curate and manage the various audio sources and files.</p>
<pre style="color:white;background:blue">
ASG> status
Currently playing: chichibu yatake [64423]
+------------------------------+
| [x]  [ ]  [ ]  [x]  [x]  [x] |
| [x]  [ ]  [x]  [x]  [x]  [ ] |
| [ ]  [ ]  [x]  [x]  [x]  [x] |
| [ ]  [ ]  [ ]  [ ]  [ ]  [ ] |
+------------------------------+
ASG>
</pre>
<div class="byline">Admin layer</div>
<h4>Audio Sources</h4>
<p>The system supports both live-streamed audio and pre-recorded material. Thus, depending on the source, it either reproduces something fixed or connects to something ongoing. <a href="#fn4" class="footnote-ref-circle" id="fnref4" role="doc-noteref" style="--fg:white;--bg:blue"><b>4</b></a></p>
<p>In its current state, the machine streams a limited selection of live audio - such as experimental streams from the Locus Sonus <a href="#fn5" class="footnote-ref-circle" id="fnref5" role="doc-noteref" style="--fg:white;--bg:blue"><b>5</b></a> project - but the bulk of the content is pre-recorded and manually curated.</p>
<p>For fun, there is also a radio mode in which the machine connects to 1,000+ live streaming stations via the Radio Browser <a href="#fn6" class="footnote-ref-circle" id="fnref6" role="doc-noteref" style="--fg:white;--bg:blue"><b>6</b></a> API. This effectively transforms the device into a radio, albeit one with possibly the most user-unfriendly channel selection interface ever conceived.</p>
<br />
<hr>
<p><span id="fn1">1) See <a href='/projects/et-01'>projects/et-01</a><a href="#fnref1" class="footnote" style="color:blue;--decoration-color:blue">↩</a><br /></span>
<span id="fn2">2) <a href='https://github.com/mpv-player/mpv'>github.com/mpv-player/mpv</a><a href="#fnref2" class="footnote" style="color:blue;--decoration-color:blue">↩</a><br /></span>
<span id="fn3">3) <a href='https://en.wikipedia.org/wiki/ESpeak'>en.wikipedia.org/wiki/ESpeak</a><a href="#fnref3" class="footnote" style="color:blue;--decoration-color:blue">↩</a><br /></span>
<span id="fn4">4) Finding reliable live audio sources for this project has proven difficult. One promising approach has been to extract audio from live video streams, given the abundance of video content online. However, major platforms actively discourage or restrict this kind of use, and so far the results have been too unstable for unattended playback.<a href="#fnref4" class="footnote" style="color:blue;--decoration-color:blue">↩</a><br /></span>
<span id="fn5">5) <a href='https://locusonus.org'>locusonus.org</a><a href="#fnref5" class="footnote" style="color:blue;--decoration-color:blue">↩</a><br /></span>
<span id="fn6">6) <a href='https://radio-browser.info'>radio-browser.info</a><a href="#fnref6" class="footnote" style="color:blue;--decoration-color:blue">↩</a><br /></span></p>
]]></content:encoded>

                <pubDate>Fri, 03 Apr 2026 22:00:00 GMT</pubDate>
            </item>
        
            <item>
                <title>Expectations</title>
                <link>https://spektrum.works/log/expectations</link>
                <guid isPermaLink="true">https://spektrum.works/log/expectations</guid>
                <dc:creator>Spektrum</dc:creator>

                <description><![CDATA[<pre style="color:darkslategrey;background:white">

            ┌──────────────────────────────┐
          + │                        ┌───x │
            │                    ┌───┘     │
quality     │...]]></description>
                <content:encoded><![CDATA[<pre style="color:darkslategrey;background:white">

            ┌──────────────────────────────┐
          + │                        ┌───x │
            │                    ┌───┘     │
quality     │                ┌───┘         │
of          │            ┌───┘             │
posts       │        ┌───┘                 │
            │    ┌───┘                     │
            │┌───┘                         │
            └┴─────────────────────────────┘
           -             time              +

</pre>
<div class="byline">
</div>
<p>Watch this space! And point your news reader to the <a href="/rss.xml">RSS feed</a></p>
]]></content:encoded>

                <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
            </item>
        

        </channel>
    </rss>