<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.sandboxpedal.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Matthew</id>
	<title>Sandbox Pedal Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.sandboxpedal.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Matthew"/>
	<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php/Special:Contributions/Matthew"/>
	<updated>2026-09-18T20:59:04Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Using_the_simulator_indicator_lamps&amp;diff=27</id>
		<title>Using the simulator indicator lamps</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Using_the_simulator_indicator_lamps&amp;diff=27"/>
		<updated>2026-09-05T01:14:25Z</updated>

		<summary type="html">&lt;p&gt;Matthew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The simulator&#039;s &#039;&#039;&#039;Indicators&#039;&#039;&#039; section has two lamps, &#039;&#039;&#039;LED1&#039;&#039;&#039; and &#039;&#039;&#039;LED2&#039;&#039;&#039;, which&lt;br /&gt;
follow the registers &amp;lt;code&amp;gt;REG30&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;REG31&amp;lt;/code&amp;gt; as your program runs. They&lt;br /&gt;
give you a way to see a value you cannot hear while you are developing — an envelope&lt;br /&gt;
follower, a tempo, the state of a switch.&lt;br /&gt;
&lt;br /&gt;
== How brightness is worked out ==&lt;br /&gt;
&lt;br /&gt;
The lamp reads its register as S1.23:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;0&#039;&#039;&#039; is off.&lt;br /&gt;
* &#039;&#039;&#039;1.0&#039;&#039;&#039; is full brightness.&lt;br /&gt;
* A negative value is off. It is not rectified, so a bipolar signal lights the lamp only&lt;br /&gt;
  on its positive half.&lt;br /&gt;
&lt;br /&gt;
The scale is linear on purpose. A program that wants a curve is two instructions from the&lt;br /&gt;
curve it wants.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The FV-1 has no LEDs.&#039;&#039;&#039; The lamps exist in the simulator only — nothing lights up on&lt;br /&gt;
the pedal when your program writes to &amp;lt;code&amp;gt;REG30&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;REG31&amp;lt;/code&amp;gt;. They are a&lt;br /&gt;
debugging aid for the time you spend writing code, not an output you can ship. A design&lt;br /&gt;
that needs an indicator on the finished pedal needs one built into the hardware.&lt;br /&gt;
&lt;br /&gt;
== Lighting a lamp ==&lt;br /&gt;
&lt;br /&gt;
Write the value you want to see into &amp;lt;code&amp;gt;REG30&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;REG31&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; #LED1 Rate&lt;br /&gt;
&lt;br /&gt;
skp     run, loop&lt;br /&gt;
wlds    sin0, 12, 32767&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
cho     rdal, sin0      ; bipolar, -1 to +1&lt;br /&gt;
sof     0.5, 0.5        ; fold to 0..1 so the lamp follows the whole cycle&lt;br /&gt;
wrax    reg30, 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Without the &amp;lt;code&amp;gt;sof 0.5, 0.5&amp;lt;/code&amp;gt; the lamp is dark for half of every LFO cycle.&lt;br /&gt;
&lt;br /&gt;
== Naming the lamps ==&lt;br /&gt;
&lt;br /&gt;
A comment tag renames a lamp in the panel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; #LED1 Tempo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The tag is read from the comment part of the line, so it never collides with code. It is&lt;br /&gt;
the same mechanism that names the pots — see&lt;br /&gt;
[[Labelling pots and lamps in your source]].&lt;br /&gt;
&lt;br /&gt;
== A gotcha ==&lt;br /&gt;
&lt;br /&gt;
Nothing on the FV-1 reserves &amp;lt;code&amp;gt;REG30&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;REG31&amp;lt;/code&amp;gt;. A program that parks&lt;br /&gt;
scratch values there will light the lamps by accident. If a lamp flickers for no reason you&lt;br /&gt;
can explain, check whether those two registers are being used as general-purpose storage.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Using the FV-1 simulator]]&lt;br /&gt;
* [[Controlling the simulator with MIDI]]&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=How-to_guides&amp;diff=26</id>
		<title>How-to guides</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=How-to_guides&amp;diff=26"/>
		<updated>2026-09-05T01:11:39Z</updated>

		<summary type="html">&lt;p&gt;Matthew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page collects the step-by-step guides for building, programming and coding the FV-1 Sandbox.&lt;br /&gt;
&lt;br /&gt;
If you are starting from nothing, work through them in this order.&lt;br /&gt;
&lt;br /&gt;
== Getting the hardware running ==&lt;br /&gt;
&lt;br /&gt;
* [[Building the FV-1 Sandbox pedal]] — where to find the PCB, schematic and firmware files.&lt;br /&gt;
* [[Installing the RP2040 programmer firmware]] — turn a bare RP2040 board into a Sandbox programmer.&lt;br /&gt;
* [[Programming an EEPROM with HEX files]] — drag a HEX file onto a drive and your pedal reloads.&lt;br /&gt;
&lt;br /&gt;
== Writing code ==&lt;br /&gt;
&lt;br /&gt;
* [[Using the Sandbox FV-1 Editor]] — the browser-based code editor and assembler.&lt;br /&gt;
* [[Writing your first FV-1 program]] — from pass-through to a working tremolo.&lt;br /&gt;
* [[Using the FV-1 simulator]] — hear an algorithm before you program hardware.&lt;br /&gt;
* [[Controlling the simulator with MIDI]] — drive the pots and the effect switch from a hardware controller.&lt;br /&gt;
* [[Using the simulator indicator lamps]] — watch REG30 and REG31 while a program runs.&lt;br /&gt;
* [[Labelling pots and lamps in your source]] — comment tags that name the simulator&#039;s controls.&lt;br /&gt;
&lt;br /&gt;
== When something goes wrong ==&lt;br /&gt;
&lt;br /&gt;
* [[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://fv1.sandboxpedal.com FV-1 Sandbox Pedal Editor]&lt;br /&gt;
* [https://fxcore.sandboxpedal.com FXCore Sandbox Pedal Editor]&lt;br /&gt;
* [https://github.com/DisasterAreaDesigns/Sandbox-FV1 Sandbox-FV1 on GitHub]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Using_the_FV-1_simulator&amp;diff=25</id>
		<title>Using the FV-1 simulator</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Using_the_FV-1_simulator&amp;diff=25"/>
		<updated>2026-09-05T01:10:30Z</updated>

		<summary type="html">&lt;p&gt;Matthew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Using the Sandbox FV-1 Editor|Sandbox FV-1 Editor]] includes a software model of the FV-1 chip.  Your assembled program runs through it in real time, so you can hear an algorithm on a test tone, an audio file or live input before you program any hardware.&lt;br /&gt;
&lt;br /&gt;
Open it with the &#039;&#039;&#039;TEST DRIVE&#039;&#039;&#039; tab on the right-hand edge of the editor.&lt;br /&gt;
&lt;br /&gt;
== Getting sound out of it ==&lt;br /&gt;
&lt;br /&gt;
# Assemble your program.  The simulator will show &#039;&#039;&#039;Not loaded&#039;&#039;&#039; if no program is assembled.&lt;br /&gt;
# Choose an input under &#039;&#039;&#039;Input Source&#039;&#039;&#039;.&lt;br /&gt;
# Press &#039;&#039;&#039;Play&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Leave &#039;&#039;&#039;Reload on assemble&#039;&#039;&#039; ticked and every successful build drops straight into the running simulator without interrupting playback.  This is the fast way to work: edit, assemble, listen, repeat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reset&#039;&#039;&#039; stops playback and clears delay memory.  Reach for it when a program has filled the delay line with something horrible and you want a clean start.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alt+P (⌃+P on Mac)&#039;&#039;&#039; plays and stops from anywhere, including the editor, and opens the tab as it starts.&lt;br /&gt;
&lt;br /&gt;
== Input sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Source !! Good for&lt;br /&gt;
|-&lt;br /&gt;
| Sine tone || Filters, pitch effects, anything where you need to hear one frequency clearly.  The frequency slider covers 20 Hz to 8 kHz.&lt;br /&gt;
|-&lt;br /&gt;
| Sawtooth / Square || Harmonically rich material — filters and distortion show their character better than on a sine.&lt;br /&gt;
|-&lt;br /&gt;
| White noise || Filter shapes and reverb tails.&lt;br /&gt;
|-&lt;br /&gt;
| Clicks || Short impulses 1 second apart - useful for testing reverb and delay trails&lt;br /&gt;
|-&lt;br /&gt;
| Audio file || Load a guitar DI or drum loop and hear the effect in context.&lt;br /&gt;
|-&lt;br /&gt;
| Live input || Play into it through your audio interface.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pots ==&lt;br /&gt;
&lt;br /&gt;
The three sliders map to &#039;&#039;&#039;POT0&#039;&#039;&#039;, &#039;&#039;&#039;POT1&#039;&#039;&#039; and &#039;&#039;&#039;POT2&#039;&#039;&#039; exactly as the physical controls do on the pedal, and they update while the program is running.  If your algorithm reads &amp;lt;code&amp;gt;POT0&amp;lt;/code&amp;gt;, moving the slider changes it live.&lt;br /&gt;
&lt;br /&gt;
== Levels ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Input&#039;&#039;&#039; and &#039;&#039;&#039;Output&#039;&#039;&#039; trim the signal either side of the simulated chip, in dB.  Input defaults to −6 dB.&lt;br /&gt;
&lt;br /&gt;
This matters more than it sounds.  The FV-1&#039;s accumulator saturates, and the simulator models that saturation, so an input that is too hot will clip inside your algorithm in the same way it would on hardware.  If something sounds unexpectedly crunchy, pull the input level down before you go hunting for a bug in your code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bypass&#039;&#039;&#039; passes the dry signal through so you can A/B against the effect.&lt;br /&gt;
&lt;br /&gt;
== The crystal setting ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Clock&#039;&#039;&#039; section changes the rate the simulated chip runs at, the same way swapping the crystal does on real hardware.  The standard FV-1 clock is 32.768 kHz.&lt;br /&gt;
&lt;br /&gt;
Your program does not change — it still runs 128 instructions per sample.  What changes is everything measured in samples:&lt;br /&gt;
&lt;br /&gt;
* Delay times scale with the clock.  The FV-1 has a fixed 32768 words of delay memory, so a faster clock buys you proportionally &#039;&#039;less&#039;&#039; delay time.  The readout under the selector shows the maximum delay and Nyquist frequency for the rate you have chosen.&lt;br /&gt;
* LFO sweeps scale too, so a chorus tuned at 32.768 kHz will modulate faster at 48 kHz.&lt;br /&gt;
&lt;br /&gt;
Changing the crystal rebuilds the audio engine, which clears delay memory.  The &#039;&#039;&#039;Audio File&#039;&#039;&#039; input source will be resampled to the FV-1 crystal frequency.&lt;br /&gt;
&lt;br /&gt;
== What the model does and does not get right ==&lt;br /&gt;
&lt;br /&gt;
The simulator is faithful about the things that give the FV-1 its character:&lt;br /&gt;
&lt;br /&gt;
* 24-bit accumulator saturation.&lt;br /&gt;
* The 14-bit companded delay memory — the reason FV-1 delays sound the way they do.&lt;br /&gt;
* LFO rates and depths, following the equations in Spin&#039;s application note AN-0001.&lt;br /&gt;
&lt;br /&gt;
One approximation to know about: the fractional interpolation inside &amp;lt;code&amp;gt;CHO&amp;lt;/code&amp;gt; is approximated rather than modelled exactly.  Chorus and flange will sound right, but they will not match hardware sample for sample.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Always confirm a design on the real pedal before you ship it.&#039;&#039;&#039;  The simulator is for iterating quickly, not for signing off.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Using the Sandbox FV-1 Editor]]&lt;br /&gt;
* [[Writing your first FV-1 program]]&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Using_the_FV-1_simulator&amp;diff=24</id>
		<title>Using the FV-1 simulator</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Using_the_FV-1_simulator&amp;diff=24"/>
		<updated>2026-09-05T01:10:19Z</updated>

		<summary type="html">&lt;p&gt;Matthew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Using the Sandbox FV-1 Editor|Sandbox FV-1 Editor]] includes a software model of the FV-1 chip.  Your assembled program runs through it in real time, so you can hear an algorithm on a test tone, an audio file or live input before you program any hardware.&lt;br /&gt;
&lt;br /&gt;
Open it with the &#039;&#039;&#039;TEST DRIVE&#039;&#039;&#039; tab on the right-hand edge of the editor.&lt;br /&gt;
&lt;br /&gt;
== Getting sound out of it ==&lt;br /&gt;
&lt;br /&gt;
# Assemble your program.  The simulato will show &#039;&#039;&#039;Not loaded&#039;&#039;&#039; if no program is assembled.&lt;br /&gt;
# Choose an input under &#039;&#039;&#039;Input Source&#039;&#039;&#039;.&lt;br /&gt;
# Press &#039;&#039;&#039;Play&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Leave &#039;&#039;&#039;Reload on assemble&#039;&#039;&#039; ticked and every successful build drops straight into the running simulator without interrupting playback.  This is the fast way to work: edit, assemble, listen, repeat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reset&#039;&#039;&#039; stops playback and clears delay memory.  Reach for it when a program has filled the delay line with something horrible and you want a clean start.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alt+P (⌃+P on Mac)&#039;&#039;&#039; plays and stops from anywhere, including the editor, and opens the tab as it starts.&lt;br /&gt;
&lt;br /&gt;
== Input sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Source !! Good for&lt;br /&gt;
|-&lt;br /&gt;
| Sine tone || Filters, pitch effects, anything where you need to hear one frequency clearly.  The frequency slider covers 20 Hz to 8 kHz.&lt;br /&gt;
|-&lt;br /&gt;
| Sawtooth / Square || Harmonically rich material — filters and distortion show their character better than on a sine.&lt;br /&gt;
|-&lt;br /&gt;
| White noise || Filter shapes and reverb tails.&lt;br /&gt;
|-&lt;br /&gt;
| Clicks || Short impulses 1 second apart - useful for testing reverb and delay trails&lt;br /&gt;
|-&lt;br /&gt;
| Audio file || Load a guitar DI or drum loop and hear the effect in context.&lt;br /&gt;
|-&lt;br /&gt;
| Live input || Play into it through your audio interface.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pots ==&lt;br /&gt;
&lt;br /&gt;
The three sliders map to &#039;&#039;&#039;POT0&#039;&#039;&#039;, &#039;&#039;&#039;POT1&#039;&#039;&#039; and &#039;&#039;&#039;POT2&#039;&#039;&#039; exactly as the physical controls do on the pedal, and they update while the program is running.  If your algorithm reads &amp;lt;code&amp;gt;POT0&amp;lt;/code&amp;gt;, moving the slider changes it live.&lt;br /&gt;
&lt;br /&gt;
== Levels ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Input&#039;&#039;&#039; and &#039;&#039;&#039;Output&#039;&#039;&#039; trim the signal either side of the simulated chip, in dB.  Input defaults to −6 dB.&lt;br /&gt;
&lt;br /&gt;
This matters more than it sounds.  The FV-1&#039;s accumulator saturates, and the simulator models that saturation, so an input that is too hot will clip inside your algorithm in the same way it would on hardware.  If something sounds unexpectedly crunchy, pull the input level down before you go hunting for a bug in your code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bypass&#039;&#039;&#039; passes the dry signal through so you can A/B against the effect.&lt;br /&gt;
&lt;br /&gt;
== The crystal setting ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Clock&#039;&#039;&#039; section changes the rate the simulated chip runs at, the same way swapping the crystal does on real hardware.  The standard FV-1 clock is 32.768 kHz.&lt;br /&gt;
&lt;br /&gt;
Your program does not change — it still runs 128 instructions per sample.  What changes is everything measured in samples:&lt;br /&gt;
&lt;br /&gt;
* Delay times scale with the clock.  The FV-1 has a fixed 32768 words of delay memory, so a faster clock buys you proportionally &#039;&#039;less&#039;&#039; delay time.  The readout under the selector shows the maximum delay and Nyquist frequency for the rate you have chosen.&lt;br /&gt;
* LFO sweeps scale too, so a chorus tuned at 32.768 kHz will modulate faster at 48 kHz.&lt;br /&gt;
&lt;br /&gt;
Changing the crystal rebuilds the audio engine, which clears delay memory.  The &#039;&#039;&#039;Audio File&#039;&#039;&#039; input source will be resampled to the FV-1 crystal frequency.&lt;br /&gt;
&lt;br /&gt;
== What the model does and does not get right ==&lt;br /&gt;
&lt;br /&gt;
The simulator is faithful about the things that give the FV-1 its character:&lt;br /&gt;
&lt;br /&gt;
* 24-bit accumulator saturation.&lt;br /&gt;
* The 14-bit companded delay memory — the reason FV-1 delays sound the way they do.&lt;br /&gt;
* LFO rates and depths, following the equations in Spin&#039;s application note AN-0001.&lt;br /&gt;
&lt;br /&gt;
One approximation to know about: the fractional interpolation inside &amp;lt;code&amp;gt;CHO&amp;lt;/code&amp;gt; is approximated rather than modelled exactly.  Chorus and flange will sound right, but they will not match hardware sample for sample.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Always confirm a design on the real pedal before you ship it.&#039;&#039;&#039;  The simulator is for iterating quickly, not for signing off.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Using the Sandbox FV-1 Editor]]&lt;br /&gt;
* [[Writing your first FV-1 program]]&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Writing_your_first_FV-1_program&amp;diff=23</id>
		<title>Writing your first FV-1 program</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Writing_your_first_FV-1_program&amp;diff=23"/>
		<updated>2026-09-05T01:05:28Z</updated>

		<summary type="html">&lt;p&gt;Matthew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This guide builds up a working tremolo from nothing, one step at a time.  Every example here assembles cleanly and can be pasted straight into the [https://fv1.sandboxpedal.com Sandbox FV-1 Editor].&lt;br /&gt;
&lt;br /&gt;
You do not need a pedal to follow along — the [[Using the FV-1 simulator|simulator]] will play all of it.&lt;br /&gt;
&lt;br /&gt;
== How an FV-1 program works ==&lt;br /&gt;
&lt;br /&gt;
The FV-1 runs your program &#039;&#039;&#039;once per audio sample&#039;&#039;&#039;, 32768 times a second.  There is no main loop that you write; the chip loops for you.&lt;br /&gt;
&lt;br /&gt;
That gives you a hard budget of &#039;&#039;&#039;128 instructions&#039;&#039;&#039;.  Anything shorter is padded with NOPs automatically.  There is no way to spend more time on one sample than another.&lt;br /&gt;
&lt;br /&gt;
Almost everything flows through a single &#039;&#039;&#039;accumulator&#039;&#039;&#039; (ACC).  You read a value into it, do arithmetic on it, and write it somewhere.  Most instructions multiply by a coefficient on the way past.&lt;br /&gt;
&lt;br /&gt;
The registers you will use first:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Register !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ADCL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADCR&amp;lt;/code&amp;gt; || Audio input, left and right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DACL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DACR&amp;lt;/code&amp;gt; || Audio output, left and right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POT0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;POT2&amp;lt;/code&amp;gt; || The three control knobs, 0.0 to 1.0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;REG0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;REG31&amp;lt;/code&amp;gt; || General-purpose storage&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Coefficients are fixed-point fractions in the range −1.0 to just under 1.0.  You cannot write &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; and expect exactly one in every field, which is why you will see &amp;lt;code&amp;gt;0.999&amp;lt;/code&amp;gt; in places where you might expect 1.&lt;br /&gt;
&lt;br /&gt;
== Step 1: pass-through ==&lt;br /&gt;
&lt;br /&gt;
The smallest useful program copies input to output.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RDAX	ADCL, 1.0	; ACC = left input&lt;br /&gt;
WRAX	DACL, 0.0	; left output = ACC, then clear ACC&lt;br /&gt;
&lt;br /&gt;
RDAX	ADCR, 1.0	; ACC = right input&lt;br /&gt;
WRAX	DACR, 0.0	; right output = ACC, then clear ACC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two instructions per channel.  &amp;lt;code&amp;gt;RDAX&amp;lt;/code&amp;gt; reads a register into the accumulator, multiplying by the coefficient on the way in.  &amp;lt;code&amp;gt;WRAX&amp;lt;/code&amp;gt; writes the accumulator to a register and then multiplies what remains in ACC by &#039;&#039;its&#039;&#039; coefficient.&lt;br /&gt;
&lt;br /&gt;
That second coefficient is the part that catches people out.  &amp;lt;code&amp;gt;WRAX DACL, 0.0&amp;lt;/code&amp;gt; means &amp;quot;write ACC to the left DAC, then zero the accumulator&amp;quot; — which is what you want before starting work on the other channel.  Using &amp;lt;code&amp;gt;WRAX DACL, 1.0&amp;lt;/code&amp;gt; would leave the value in ACC and the right channel would come out as a mix of both.&lt;br /&gt;
&lt;br /&gt;
Assemble this and play it through the simulator.  It should sound like nothing at all, which is the correct result.&lt;br /&gt;
&lt;br /&gt;
== Step 2: a volume control ==&lt;br /&gt;
&lt;br /&gt;
Now put POT0 in charge of the level.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RDAX	ADCL, 1.0&lt;br /&gt;
MULX	POT0		; ACC = ACC * POT0&lt;br /&gt;
WRAX	DACL, 0.0&lt;br /&gt;
&lt;br /&gt;
RDAX	ADCR, 1.0&lt;br /&gt;
MULX	POT0&lt;br /&gt;
WRAX	DACR, 0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MULX&amp;lt;/code&amp;gt; multiplies the accumulator by the contents of a register.  Because &amp;lt;code&amp;gt;POT0&amp;lt;/code&amp;gt; reads 0.0 to 1.0, this is a straightforward volume knob.&lt;br /&gt;
&lt;br /&gt;
Open the SIM panel and move the POT0 slider while it plays.&lt;br /&gt;
&lt;br /&gt;
== Step 3: an LFO ==&lt;br /&gt;
&lt;br /&gt;
A tremolo is a volume control that moves on its own, so the next piece is a low-frequency oscillator.&lt;br /&gt;
&lt;br /&gt;
The FV-1 has two sine LFOs (&amp;lt;code&amp;gt;SIN0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SIN1&amp;lt;/code&amp;gt;) and two ramp LFOs (&amp;lt;code&amp;gt;RMP0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RMP1&amp;lt;/code&amp;gt;).  You start a sine LFO with &amp;lt;code&amp;gt;WLDS&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WLDS	SIN0, 40, 32767		; LFO 0: rate 40, full amplitude&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This only needs to happen once, not on every one of the 32768 samples per second.  The idiom for that is a conditional skip on the &amp;lt;code&amp;gt;RUN&amp;lt;/code&amp;gt; flag, which is clear on the very first pass through the program and set on every pass after:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SKP	RUN, loop&lt;br /&gt;
WLDS	SIN0, 40, 32767&lt;br /&gt;
loop:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the first sample, &amp;lt;code&amp;gt;RUN&amp;lt;/code&amp;gt; is clear, so the skip does not happen and the LFO is set up.  On every subsequent sample the program jumps straight over &amp;lt;code&amp;gt;WLDS&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;loop&amp;lt;/code&amp;gt; label.&lt;br /&gt;
&lt;br /&gt;
To read the LFO&#039;s current value, use &amp;lt;code&amp;gt;CHO RDAL&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHO	RDAL, SIN0	; ACC = the sine LFO, swinging -1.0 to +1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 4: shaping the LFO into a gain ==&lt;br /&gt;
&lt;br /&gt;
The LFO swings from −1.0 to +1.0, but a gain needs to be positive.  &amp;lt;code&amp;gt;SOF&amp;lt;/code&amp;gt; — scale and offset — fixes that in one instruction.  &amp;lt;code&amp;gt;SOF a, b&amp;lt;/code&amp;gt; computes &amp;lt;code&amp;gt;ACC = ACC × a + b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHO	RDAL, SIN0	; -1.0 .. +1.0&lt;br /&gt;
SOF	0.5, 0.5	; halve it, shift it up: now 0.0 .. 1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, depth.  Multiplying by POT1 scales the swing down, and a second &amp;lt;code&amp;gt;SOF&amp;lt;/code&amp;gt; flips it so the gain sits just below unity at minimum depth:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MULX	POT1		; 0.0 .. depth&lt;br /&gt;
SOF	-1.0, 0.999	; (1 - depth) .. 1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With POT1 at zero the gain is a constant 0.999 — effectively off.  With POT1 fully up the gain swings across the full range.&lt;br /&gt;
&lt;br /&gt;
== The finished tremolo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; Simple tremolo&lt;br /&gt;
; POT0 = rate, POT1 = depth&lt;br /&gt;
&lt;br /&gt;
EQU	mod	REG0&lt;br /&gt;
&lt;br /&gt;
; Start the sine LFO once, on the first pass only&lt;br /&gt;
SKP	RUN, loop&lt;br /&gt;
WLDS	SIN0, 40, 32767&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
; POT0 sets the LFO rate&lt;br /&gt;
RDAX	POT0, 0.5&lt;br /&gt;
SOF	1.0, 0.02&lt;br /&gt;
WRAX	SIN0_RATE, 0.0&lt;br /&gt;
&lt;br /&gt;
; Read the LFO and fold it into a 0..1 gain&lt;br /&gt;
CHO	RDAL, SIN0&lt;br /&gt;
SOF	0.5, 0.5&lt;br /&gt;
MULX	POT1&lt;br /&gt;
SOF	-1.0, 0.999&lt;br /&gt;
WRAX	mod, 0.0&lt;br /&gt;
&lt;br /&gt;
; Apply the gain to both channels&lt;br /&gt;
RDAX	ADCL, 1.0&lt;br /&gt;
MULX	mod&lt;br /&gt;
WRAX	DACL, 0.0&lt;br /&gt;
&lt;br /&gt;
RDAX	ADCR, 1.0&lt;br /&gt;
MULX	mod&lt;br /&gt;
WRAX	DACR, 0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sixteen instructions, out of the 128 available.&lt;br /&gt;
&lt;br /&gt;
Two new things appear here.  &amp;lt;code&amp;gt;EQU mod REG0&amp;lt;/code&amp;gt; gives &amp;lt;code&amp;gt;REG0&amp;lt;/code&amp;gt; a readable name — the assembler substitutes it, and it costs nothing at runtime.  Writing to &amp;lt;code&amp;gt;SIN0_RATE&amp;lt;/code&amp;gt; changes the LFO rate while the program runs, which is what turns POT0 into a rate knob; the &amp;lt;code&amp;gt;SOF 1.0, 0.02&amp;lt;/code&amp;gt; keeps the rate from reaching zero at the bottom of the sweep.&lt;br /&gt;
&lt;br /&gt;
Load it into the simulator, press Play, and move POT0 and POT1.&lt;br /&gt;
&lt;br /&gt;
== Where to go next ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Delay memory.&#039;&#039;&#039;  The &amp;lt;code&amp;gt;MEM&amp;lt;/code&amp;gt; directive allocates space in the FV-1&#039;s 32768 words of delay memory: &amp;lt;code&amp;gt;MEM delay 16000&amp;lt;/code&amp;gt;.  It creates three symbols — &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; (start), &amp;lt;code&amp;gt;delay#&amp;lt;/code&amp;gt; (end) and &amp;lt;code&amp;gt;delay^&amp;lt;/code&amp;gt; (midpoint).  &amp;lt;code&amp;gt;RDA&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WRA&amp;lt;/code&amp;gt; read and write it.&lt;br /&gt;
* &#039;&#039;&#039;The built-in examples.&#039;&#039;&#039;  &#039;&#039;&#039;Load File…&#039;&#039;&#039; in the editor offers Pass-through, Delay, Chorus and Tremolo.  Reading working code is the fastest way to pick up the idioms.&lt;br /&gt;
* &#039;&#039;&#039;The instruction reference.&#039;&#039;&#039;  The &#039;&#039;&#039;HELP&#039;&#039;&#039; tab lists the full instruction set with operand formats.&lt;br /&gt;
* &#039;&#039;&#039;Spin&#039;s documentation.&#039;&#039;&#039;  The FV-1 datasheet and application note AN-0001 are the authoritative source on LFO behaviour and the fixed-point formats.&lt;br /&gt;
&lt;br /&gt;
== A few things that bite beginners ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Forgetting to clear ACC.&#039;&#039;&#039;  If a channel sounds like it has the other channel bleeding into it, check your &amp;lt;code&amp;gt;WRAX&amp;lt;/code&amp;gt; coefficients.&lt;br /&gt;
* &#039;&#039;&#039;Coefficient range.&#039;&#039;&#039;  Coefficients are fractions below 1.0.  If you need gain above unity, do it in stages or use a format that allows it.&lt;br /&gt;
* &#039;&#039;&#039;Setup code running every sample.&#039;&#039;&#039;  &amp;lt;code&amp;gt;WLDS&amp;lt;/code&amp;gt; and friends belong behind a &amp;lt;code&amp;gt;SKP RUN&amp;lt;/code&amp;gt; guard.&lt;br /&gt;
* &#039;&#039;&#039;Running out of instructions.&#039;&#039;&#039;  128 is a hard ceiling.  If you hit it, the answer is usually a cheaper filter, not a cleverer one.&lt;br /&gt;
* &#039;&#039;&#039;Trusting the simulator on chorus.&#039;&#039;&#039;  &amp;lt;code&amp;gt;CHO&amp;lt;/code&amp;gt; interpolation is approximated.  Confirm modulation effects on hardware.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Using the Sandbox FV-1 Editor]]&lt;br /&gt;
* [[Using the FV-1 simulator]]&lt;br /&gt;
* [[Programming an EEPROM with HEX files]]&lt;br /&gt;
* [[Controlling the simulator with MIDI]] — drive the pots and the effect switch from a hardware controller.&lt;br /&gt;
* [[Using the simulator indicator lamps]] — watch REG30 and REG31 while a program runs.&lt;br /&gt;
* [[Labelling pots and lamps in your source]] — comment tags that name the simulator&#039;s controls.&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Labelling_pots_and_lamps_in_your_source&amp;diff=22</id>
		<title>Labelling pots and lamps in your source</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Labelling_pots_and_lamps_in_your_source&amp;diff=22"/>
		<updated>2026-09-05T01:04:55Z</updated>

		<summary type="html">&lt;p&gt;Matthew: Created page with &amp;quot;A slider marked &amp;#039;&amp;#039;&amp;#039;POT0&amp;#039;&amp;#039;&amp;#039; tells you nothing when you come back to a program six months later. The editor reads short tags out of your comments and uses them to label the simulator&amp;#039;s controls as you type.  == The tags ==  {| class=&amp;quot;wikitable&amp;quot; ! Tag !! Labels |- | &amp;lt;code&amp;gt;; #POT0 Delay time&amp;lt;/code&amp;gt; || POT0, POT1, POT2 |- | &amp;lt;code&amp;gt;; #LED1 Tempo&amp;lt;/code&amp;gt; || The two indicator lamps |}  Tags are read from the comment part of a line, so they n...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A slider marked &#039;&#039;&#039;POT0&#039;&#039;&#039; tells you nothing when you come back to a program six months&lt;br /&gt;
later. The editor reads short tags out of your comments and uses them to label the&lt;br /&gt;
simulator&#039;s controls as you type.&lt;br /&gt;
&lt;br /&gt;
== The tags ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tag !! Labels&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;; #POT0 Delay time&amp;lt;/code&amp;gt; || POT0, POT1, POT2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;; #LED1 Tempo&amp;lt;/code&amp;gt; || The two [[Using the simulator indicator lamps|indicator lamps]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Tags are read from the comment part of a line, so they never collide with code. Hovering a&lt;br /&gt;
renamed pot still shows which one it is underneath.&lt;br /&gt;
&lt;br /&gt;
== A related tag ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;; #slot 5&amp;lt;/code&amp;gt; works the same way on the hardware side. With&lt;br /&gt;
&#039;&#039;&#039;Filename / Toggle Position&#039;&#039;&#039; set to &#039;&#039;&#039;AUTO&#039;&#039;&#039;, the editor reads the tag and writes to&lt;br /&gt;
that slot, so a program carries its own destination. With no tag it writes&lt;br /&gt;
&amp;lt;code&amp;gt;3.hex&amp;lt;/code&amp;gt;, the slot a board with no toggles fitted reads. See&lt;br /&gt;
[[Using the Sandbox FV-1 Editor]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Using the FV-1 simulator]]&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Using_the_simulator_indicator_lamps&amp;diff=21</id>
		<title>Using the simulator indicator lamps</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Using_the_simulator_indicator_lamps&amp;diff=21"/>
		<updated>2026-09-05T01:04:29Z</updated>

		<summary type="html">&lt;p&gt;Matthew: Created page with &amp;quot;The simulator&amp;#039;s &amp;#039;&amp;#039;&amp;#039;Indicators&amp;#039;&amp;#039;&amp;#039; section has two lamps, &amp;#039;&amp;#039;&amp;#039;LED1&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;LED2&amp;#039;&amp;#039;&amp;#039;, which follow the registers &amp;lt;code&amp;gt;REG30&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;REG31&amp;lt;/code&amp;gt; as your program runs. They give you a way to see a value you cannot hear — an envelope follower, a tempo, the state of a switch.  == How brightness is worked out ==  The lamp reads its register as S1.23:  * &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; is off. * &amp;#039;&amp;#039;&amp;#039;1.0&amp;#039;&amp;#039;&amp;#039; is full brightness. * A negative value is off. It is not rectified, so a bipolar signa...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The simulator&#039;s &#039;&#039;&#039;Indicators&#039;&#039;&#039; section has two lamps, &#039;&#039;&#039;LED1&#039;&#039;&#039; and &#039;&#039;&#039;LED2&#039;&#039;&#039;, which&lt;br /&gt;
follow the registers &amp;lt;code&amp;gt;REG30&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;REG31&amp;lt;/code&amp;gt; as your program runs. They&lt;br /&gt;
give you a way to see a value you cannot hear — an envelope follower, a tempo, the state&lt;br /&gt;
of a switch.&lt;br /&gt;
&lt;br /&gt;
== How brightness is worked out ==&lt;br /&gt;
&lt;br /&gt;
The lamp reads its register as S1.23:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;0&#039;&#039;&#039; is off.&lt;br /&gt;
* &#039;&#039;&#039;1.0&#039;&#039;&#039; is full brightness.&lt;br /&gt;
* A negative value is off. It is not rectified, so a bipolar signal lights the lamp only&lt;br /&gt;
  on its positive half.&lt;br /&gt;
&lt;br /&gt;
The scale is linear on purpose. A program that wants a curve is two instructions from the&lt;br /&gt;
curve it wants.&lt;br /&gt;
&lt;br /&gt;
== Lighting a lamp ==&lt;br /&gt;
&lt;br /&gt;
Write the value you want to see into &amp;lt;code&amp;gt;REG30&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;REG31&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; #LED1 Rate&lt;br /&gt;
&lt;br /&gt;
skp     run, loop&lt;br /&gt;
wlds    sin0, 12, 32767&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
cho     rdal, sin0      ; bipolar, -1 to +1&lt;br /&gt;
sof     0.5, 0.5        ; fold to 0..1 so the lamp follows the whole cycle&lt;br /&gt;
wrax    reg30, 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Without the &amp;lt;code&amp;gt;sof 0.5, 0.5&amp;lt;/code&amp;gt; the lamp is dark for half of every LFO cycle.&lt;br /&gt;
&lt;br /&gt;
== Naming the lamps ==&lt;br /&gt;
&lt;br /&gt;
A comment tag renames a lamp in the panel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; #LED1 Tempo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The tag is read from the comment part of the line, so it never collides with code. It is&lt;br /&gt;
the same mechanism that names the pots — see&lt;br /&gt;
[[Labelling pots and lamps in your source]].&lt;br /&gt;
&lt;br /&gt;
== A gotcha ==&lt;br /&gt;
&lt;br /&gt;
Nothing on the FV-1 reserves &amp;lt;code&amp;gt;REG30&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;REG31&amp;lt;/code&amp;gt;. A program that parks&lt;br /&gt;
scratch values there will light the lamps by accident. If a lamp flickers for no reason you&lt;br /&gt;
can explain, check whether those two registers are being used as general-purpose storage.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Using the FV-1 simulator]]&lt;br /&gt;
* [[Controlling the simulator with MIDI]]&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Controlling_the_simulator_with_MIDI&amp;diff=20</id>
		<title>Controlling the simulator with MIDI</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Controlling_the_simulator_with_MIDI&amp;diff=20"/>
		<updated>2026-09-05T01:04:06Z</updated>

		<summary type="html">&lt;p&gt;Matthew: Created page with &amp;quot;The simulator in the Sandbox FV-1 Editor can be played from a MIDI controller plugged into your computer. The pots and the effect switch respond to control changes, so you can sweep a parameter with a real fader while a program runs.  The Sandbox pedal itself has no MIDI input. This drives the simulator only.  == Before you start ==  Web MIDI needs Chrome, Edge or Firefox. Safari does not implement it, so the &amp;#039;&amp;#039;&amp;#039;MIDI Control&amp;#039;&amp;#039;&amp;#039; section w...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The simulator in the [[Using the Sandbox FV-1 Editor|Sandbox FV-1 Editor]] can be played&lt;br /&gt;
from a MIDI controller plugged into your computer. The pots and the effect switch respond&lt;br /&gt;
to control changes, so you can sweep a parameter with a real fader while a program runs.&lt;br /&gt;
&lt;br /&gt;
The Sandbox pedal itself has no MIDI input. This drives the simulator only.&lt;br /&gt;
&lt;br /&gt;
== Before you start ==&lt;br /&gt;
&lt;br /&gt;
Web MIDI needs Chrome, Edge or Firefox. Safari does not implement it, so the&lt;br /&gt;
&#039;&#039;&#039;MIDI Control&#039;&#039;&#039; section will not connect there. Everything else in the simulator still&lt;br /&gt;
works — see [[Using the FV-1 simulator]].&lt;br /&gt;
&lt;br /&gt;
== Connecting a controller ==&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;&#039;TEST DRIVE&#039;&#039;&#039; tab and find the &#039;&#039;&#039;MIDI Control&#039;&#039;&#039; section.&lt;br /&gt;
# Press &#039;&#039;&#039;Enable MIDI&#039;&#039;&#039; and allow the browser&#039;s prompt.&lt;br /&gt;
# Choose an &#039;&#039;&#039;Input&#039;&#039;&#039;. &#039;&#039;All inputs&#039;&#039; listens to every device attached.&lt;br /&gt;
# Choose a &#039;&#039;&#039;Channel&#039;&#039;&#039;, or leave it on &#039;&#039;Omni&#039;&#039; to accept all sixteen.&lt;br /&gt;
&lt;br /&gt;
The status line beside the button shows the last message that was accepted. If it never&lt;br /&gt;
changes while you move a control, the message is not reaching the page at all — check the&lt;br /&gt;
input and channel before you check anything else.&lt;br /&gt;
&lt;br /&gt;
Your input and channel are remembered between sessions, and a controller that is unplugged&lt;br /&gt;
and plugged back in is picked up again on its own.&lt;br /&gt;
&lt;br /&gt;
== What the controls do ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Control change !! Moves&lt;br /&gt;
|-&lt;br /&gt;
| CC50 || POT0&lt;br /&gt;
|-&lt;br /&gt;
| CC51 || POT1&lt;br /&gt;
|-&lt;br /&gt;
| CC52 || POT2&lt;br /&gt;
|-&lt;br /&gt;
| CC102 || The effect switch: 0–63 bypasses, 64–127 engages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
MIDI moves the same controls the sliders do, at the full 128 steps a control change&lt;br /&gt;
carries, so a program cannot tell the difference between a fader and a mouse.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Using the FV-1 simulator]]&lt;br /&gt;
* [[Using the Sandbox FV-1 Editor]]&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Main_Page&amp;diff=19</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Main_Page&amp;diff=19"/>
		<updated>2026-08-23T23:53:30Z</updated>

		<summary type="html">&lt;p&gt;Matthew: Link the how-to guides index&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;Welcome to Sandbox Pedal!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Knowledge Base for DSP Guitar Pedal DIY.&lt;br /&gt;
&lt;br /&gt;
What is Sandbox?  It&#039;s an open-source hardware and software package that allows for digital pedal DIY.  It uses the Spin Semiconductor FV-1 digital signal processing (DSP) integrated circuit and an off-the-shelf RP2040 microcontroller board, and presents the user with the simplest possible way to get started.&lt;br /&gt;
&lt;br /&gt;
# Write your signal processing code or find some cool code from another user.&lt;br /&gt;
# Use our code editor to assemble into a HEX file.&lt;br /&gt;
# Drag the HEX file into the Sandbox FV-1 pedal.&lt;br /&gt;
# Play.&lt;br /&gt;
&lt;br /&gt;
No drivers to install.  No operating system requirements.  No need to be tied to any particular hardware.  If you don&#039;t want to buy anything from us, that&#039;s okay - we made it all free anyway.&lt;br /&gt;
&lt;br /&gt;
The bare minimum thing you&#039;ll need is an RP2040 board like a RP2040-Zero or Raspberry Pi Pico.  These are open-source microcontrollers with a USB port and lots of pins you can use to interface with the outside world.  Connect it to your computer, drag our firmware into the board, then hook up a couple of wires to the EEPROM in your pedal.  Drag a HEX file into the RP2040 and the EEPROM will program automatically.  You don&#039;t need any drivers, no software, nothing but the normal file explorer / Finder / file manager application on your computer.&lt;br /&gt;
&lt;br /&gt;
Why do we need this?  Honestly, we don&#039;t.  There are plenty of other ways to get started with DSP, including several other FV-1 based projects.  Go ahead and try some of them out.&lt;br /&gt;
&lt;br /&gt;
[https://www.pedalpcb.com/product/fv1dev/ PedalPCB FV-1 DEV] &lt;br /&gt;
&lt;br /&gt;
* Requires building a PCB including two 28-pin surface-mount ICs.&lt;br /&gt;
* Requires command-line tools for Mac / Linux.&lt;br /&gt;
* Programming software needs .BIN files instead of native FV-1 HEX.&lt;br /&gt;
* Works best on Windows but limited / basic Mac / Linux support.&lt;br /&gt;
* Requires at least two applications to work (FV-1 assembler or SpinCAD and AsProgrammer or CLI tools)&lt;br /&gt;
* Base hardware is mono in and out&lt;br /&gt;
&lt;br /&gt;
Okay, I see you&#039;re back!  How was that experience?  A little cryptic, maybe?  You need to install some drivers, or maybe update your Python install, something like that?  Then you need to build a pedal from a kit and maybe that doesn&#039;t work first time, sure, we get it.&lt;br /&gt;
&lt;br /&gt;
We&#039;re trying to remove as much friction as possible, and that starts with good tools.  Ask your granddad about good tools vs. cheap tools and you&#039;ll probably hear something like &amp;quot;buy it nice or buy it twice,&amp;quot; and that definitely agrees with our findings.&lt;br /&gt;
&lt;br /&gt;
Making a chorus algorithm isn&#039;t harder than swapping diodes in a Tube Screamer, but the current state of the industry makes it &#039;&#039;seem&#039;&#039; a lot more difficult&#039;&#039;.&#039;&#039;  Starting DSP isn&#039;t hard, but there are a lot of steps and every single one of them has a path to failure.&lt;br /&gt;
&lt;br /&gt;
The traditional way of getting started with FV-1 was to buy the official development board (US$120) from Spin Semiconductor, then use their SpinASM IDE program on a Windows computer to develop and deploy your algorithms.  The dev board has RCA inputs and isn&#039;t particularly guitar-friendly, so you really need some extra hardware to get something that&#039;s closer to a real pedal.&lt;br /&gt;
&lt;br /&gt;
Once you have your algorithms, you need to burn them to an EEPROM for use with an actual pedal.  You can use the dev board to program EEPROMS but it&#039;s a bit clunky and you need the IDE to use it.  It&#039;s fine for one pedal but if you wanted to make 50 or 100 a standalone EEPROM programmer makes more sense.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [[How-to guides]]&lt;br /&gt;
* [[Building the FV-1 Sandbox pedal]]&lt;br /&gt;
* [https://fv1.sandboxpedal.com FV-1 Sandbox Pedal Editor]&lt;br /&gt;
* [https://fxcore.sandboxpedal.com FXCore Sandbox Pedal Editor]&lt;br /&gt;
* [[Troubleshooting]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Writing_your_first_FV-1_program&amp;diff=18</id>
		<title>Writing your first FV-1 program</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Writing_your_first_FV-1_program&amp;diff=18"/>
		<updated>2026-08-23T23:53:27Z</updated>

		<summary type="html">&lt;p&gt;Matthew: Add how-to guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This guide builds up a working tremolo from nothing, one step at a time.  Every example here assembles cleanly and can be pasted straight into the [https://fv1.sandboxpedal.com Sandbox FV-1 Editor].&lt;br /&gt;
&lt;br /&gt;
You do not need a pedal to follow along — the [[Using the FV-1 simulator|simulator]] will play all of it.&lt;br /&gt;
&lt;br /&gt;
== How an FV-1 program works ==&lt;br /&gt;
&lt;br /&gt;
The FV-1 runs your program &#039;&#039;&#039;once per audio sample&#039;&#039;&#039;, 32768 times a second.  There is no main loop that you write; the chip loops for you.&lt;br /&gt;
&lt;br /&gt;
That gives you a hard budget of &#039;&#039;&#039;128 instructions&#039;&#039;&#039;.  Anything shorter is padded with NOPs automatically.  There is no way to spend more time on one sample than another.&lt;br /&gt;
&lt;br /&gt;
Almost everything flows through a single &#039;&#039;&#039;accumulator&#039;&#039;&#039; (ACC).  You read a value into it, do arithmetic on it, and write it somewhere.  Most instructions multiply by a coefficient on the way past.&lt;br /&gt;
&lt;br /&gt;
The registers you will use first:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Register !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ADCL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADCR&amp;lt;/code&amp;gt; || Audio input, left and right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DACL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DACR&amp;lt;/code&amp;gt; || Audio output, left and right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POT0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;POT2&amp;lt;/code&amp;gt; || The three control knobs, 0.0 to 1.0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;REG0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;REG31&amp;lt;/code&amp;gt; || General-purpose storage&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Coefficients are fixed-point fractions in the range −1.0 to just under 1.0.  You cannot write &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; and expect exactly one in every field, which is why you will see &amp;lt;code&amp;gt;0.999&amp;lt;/code&amp;gt; in places where you might expect 1.&lt;br /&gt;
&lt;br /&gt;
== Step 1: pass-through ==&lt;br /&gt;
&lt;br /&gt;
The smallest useful program copies input to output.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RDAX	ADCL, 1.0	; ACC = left input&lt;br /&gt;
WRAX	DACL, 0.0	; left output = ACC, then clear ACC&lt;br /&gt;
&lt;br /&gt;
RDAX	ADCR, 1.0	; ACC = right input&lt;br /&gt;
WRAX	DACR, 0.0	; right output = ACC, then clear ACC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two instructions per channel.  &amp;lt;code&amp;gt;RDAX&amp;lt;/code&amp;gt; reads a register into the accumulator, multiplying by the coefficient on the way in.  &amp;lt;code&amp;gt;WRAX&amp;lt;/code&amp;gt; writes the accumulator to a register and then multiplies what remains in ACC by &#039;&#039;its&#039;&#039; coefficient.&lt;br /&gt;
&lt;br /&gt;
That second coefficient is the part that catches people out.  &amp;lt;code&amp;gt;WRAX DACL, 0.0&amp;lt;/code&amp;gt; means &amp;quot;write ACC to the left DAC, then zero the accumulator&amp;quot; — which is what you want before starting work on the other channel.  Using &amp;lt;code&amp;gt;WRAX DACL, 1.0&amp;lt;/code&amp;gt; would leave the value in ACC and the right channel would come out as a mix of both.&lt;br /&gt;
&lt;br /&gt;
Assemble this and play it through the simulator.  It should sound like nothing at all, which is the correct result.&lt;br /&gt;
&lt;br /&gt;
== Step 2: a volume control ==&lt;br /&gt;
&lt;br /&gt;
Now put POT0 in charge of the level.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RDAX	ADCL, 1.0&lt;br /&gt;
MULX	POT0		; ACC = ACC * POT0&lt;br /&gt;
WRAX	DACL, 0.0&lt;br /&gt;
&lt;br /&gt;
RDAX	ADCR, 1.0&lt;br /&gt;
MULX	POT0&lt;br /&gt;
WRAX	DACR, 0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MULX&amp;lt;/code&amp;gt; multiplies the accumulator by the contents of a register.  Because &amp;lt;code&amp;gt;POT0&amp;lt;/code&amp;gt; reads 0.0 to 1.0, this is a straightforward volume knob.&lt;br /&gt;
&lt;br /&gt;
Open the SIM panel and move the POT0 slider while it plays.&lt;br /&gt;
&lt;br /&gt;
== Step 3: an LFO ==&lt;br /&gt;
&lt;br /&gt;
A tremolo is a volume control that moves on its own, so the next piece is a low-frequency oscillator.&lt;br /&gt;
&lt;br /&gt;
The FV-1 has two sine LFOs (&amp;lt;code&amp;gt;SIN0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SIN1&amp;lt;/code&amp;gt;) and two ramp LFOs (&amp;lt;code&amp;gt;RMP0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RMP1&amp;lt;/code&amp;gt;).  You start a sine LFO with &amp;lt;code&amp;gt;WLDS&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WLDS	SIN0, 40, 32767		; LFO 0: rate 40, full amplitude&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This only needs to happen once, not on every one of the 32768 samples per second.  The idiom for that is a conditional skip on the &amp;lt;code&amp;gt;RUN&amp;lt;/code&amp;gt; flag, which is clear on the very first pass through the program and set on every pass after:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SKP	RUN, loop&lt;br /&gt;
WLDS	SIN0, 40, 32767&lt;br /&gt;
loop:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the first sample, &amp;lt;code&amp;gt;RUN&amp;lt;/code&amp;gt; is clear, so the skip does not happen and the LFO is set up.  On every subsequent sample the program jumps straight over &amp;lt;code&amp;gt;WLDS&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;loop&amp;lt;/code&amp;gt; label.&lt;br /&gt;
&lt;br /&gt;
To read the LFO&#039;s current value, use &amp;lt;code&amp;gt;CHO RDAL&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHO	RDAL, SIN0	; ACC = the sine LFO, swinging -1.0 to +1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 4: shaping the LFO into a gain ==&lt;br /&gt;
&lt;br /&gt;
The LFO swings from −1.0 to +1.0, but a gain needs to be positive.  &amp;lt;code&amp;gt;SOF&amp;lt;/code&amp;gt; — scale and offset — fixes that in one instruction.  &amp;lt;code&amp;gt;SOF a, b&amp;lt;/code&amp;gt; computes &amp;lt;code&amp;gt;ACC = ACC × a + b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHO	RDAL, SIN0	; -1.0 .. +1.0&lt;br /&gt;
SOF	0.5, 0.5	; halve it, shift it up: now 0.0 .. 1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, depth.  Multiplying by POT1 scales the swing down, and a second &amp;lt;code&amp;gt;SOF&amp;lt;/code&amp;gt; flips it so the gain sits just below unity at minimum depth:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MULX	POT1		; 0.0 .. depth&lt;br /&gt;
SOF	-1.0, 0.999	; (1 - depth) .. 1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With POT1 at zero the gain is a constant 0.999 — effectively off.  With POT1 fully up the gain swings across the full range.&lt;br /&gt;
&lt;br /&gt;
== The finished tremolo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; Simple tremolo&lt;br /&gt;
; POT0 = rate, POT1 = depth&lt;br /&gt;
&lt;br /&gt;
EQU	mod	REG0&lt;br /&gt;
&lt;br /&gt;
; Start the sine LFO once, on the first pass only&lt;br /&gt;
SKP	RUN, loop&lt;br /&gt;
WLDS	SIN0, 40, 32767&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
; POT0 sets the LFO rate&lt;br /&gt;
RDAX	POT0, 0.5&lt;br /&gt;
SOF	1.0, 0.02&lt;br /&gt;
WRAX	SIN0_RATE, 0.0&lt;br /&gt;
&lt;br /&gt;
; Read the LFO and fold it into a 0..1 gain&lt;br /&gt;
CHO	RDAL, SIN0&lt;br /&gt;
SOF	0.5, 0.5&lt;br /&gt;
MULX	POT1&lt;br /&gt;
SOF	-1.0, 0.999&lt;br /&gt;
WRAX	mod, 0.0&lt;br /&gt;
&lt;br /&gt;
; Apply the gain to both channels&lt;br /&gt;
RDAX	ADCL, 1.0&lt;br /&gt;
MULX	mod&lt;br /&gt;
WRAX	DACL, 0.0&lt;br /&gt;
&lt;br /&gt;
RDAX	ADCR, 1.0&lt;br /&gt;
MULX	mod&lt;br /&gt;
WRAX	DACR, 0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sixteen instructions, out of the 128 available.&lt;br /&gt;
&lt;br /&gt;
Two new things appear here.  &amp;lt;code&amp;gt;EQU mod REG0&amp;lt;/code&amp;gt; gives &amp;lt;code&amp;gt;REG0&amp;lt;/code&amp;gt; a readable name — the assembler substitutes it, and it costs nothing at runtime.  Writing to &amp;lt;code&amp;gt;SIN0_RATE&amp;lt;/code&amp;gt; changes the LFO rate while the program runs, which is what turns POT0 into a rate knob; the &amp;lt;code&amp;gt;SOF 1.0, 0.02&amp;lt;/code&amp;gt; keeps the rate from reaching zero at the bottom of the sweep.&lt;br /&gt;
&lt;br /&gt;
Load it into the simulator, press Play, and move POT0 and POT1.&lt;br /&gt;
&lt;br /&gt;
== Where to go next ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Delay memory.&#039;&#039;&#039;  The &amp;lt;code&amp;gt;MEM&amp;lt;/code&amp;gt; directive allocates space in the FV-1&#039;s 32768 words of delay memory: &amp;lt;code&amp;gt;MEM delay 16000&amp;lt;/code&amp;gt;.  It creates three symbols — &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; (start), &amp;lt;code&amp;gt;delay#&amp;lt;/code&amp;gt; (end) and &amp;lt;code&amp;gt;delay^&amp;lt;/code&amp;gt; (midpoint).  &amp;lt;code&amp;gt;RDA&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WRA&amp;lt;/code&amp;gt; read and write it.&lt;br /&gt;
* &#039;&#039;&#039;The built-in examples.&#039;&#039;&#039;  &#039;&#039;&#039;Load File…&#039;&#039;&#039; in the editor offers Pass-through, Delay, Chorus and Tremolo.  Reading working code is the fastest way to pick up the idioms.&lt;br /&gt;
* &#039;&#039;&#039;The instruction reference.&#039;&#039;&#039;  The &#039;&#039;&#039;HELP&#039;&#039;&#039; tab lists the full instruction set with operand formats.&lt;br /&gt;
* &#039;&#039;&#039;Spin&#039;s documentation.&#039;&#039;&#039;  The FV-1 datasheet and application note AN-0001 are the authoritative source on LFO behaviour and the fixed-point formats.&lt;br /&gt;
&lt;br /&gt;
== A few things that bite beginners ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Forgetting to clear ACC.&#039;&#039;&#039;  If a channel sounds like it has the other channel bleeding into it, check your &amp;lt;code&amp;gt;WRAX&amp;lt;/code&amp;gt; coefficients.&lt;br /&gt;
* &#039;&#039;&#039;Coefficient range.&#039;&#039;&#039;  Coefficients are fractions below 1.0.  If you need gain above unity, do it in stages or use a format that allows it.&lt;br /&gt;
* &#039;&#039;&#039;Setup code running every sample.&#039;&#039;&#039;  &amp;lt;code&amp;gt;WLDS&amp;lt;/code&amp;gt; and friends belong behind a &amp;lt;code&amp;gt;SKP RUN&amp;lt;/code&amp;gt; guard.&lt;br /&gt;
* &#039;&#039;&#039;Running out of instructions.&#039;&#039;&#039;  128 is a hard ceiling.  If you hit it, the answer is usually a cheaper filter, not a cleverer one.&lt;br /&gt;
* &#039;&#039;&#039;Trusting the simulator on chorus.&#039;&#039;&#039;  &amp;lt;code&amp;gt;CHO&amp;lt;/code&amp;gt; interpolation is approximated.  Confirm modulation effects on hardware.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Using the Sandbox FV-1 Editor]]&lt;br /&gt;
* [[Using the FV-1 simulator]]&lt;br /&gt;
* [[Programming an EEPROM with HEX files]]&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Using_the_FV-1_simulator&amp;diff=17</id>
		<title>Using the FV-1 simulator</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Using_the_FV-1_simulator&amp;diff=17"/>
		<updated>2026-08-23T23:53:25Z</updated>

		<summary type="html">&lt;p&gt;Matthew: Add how-to guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Using the Sandbox FV-1 Editor|Sandbox FV-1 Editor]] includes a software model of the FV-1 chip.  Your assembled program runs through it in real time, so you can hear an algorithm on a test tone, an audio file or live input before you program any hardware.&lt;br /&gt;
&lt;br /&gt;
Open it with the &#039;&#039;&#039;SIM&#039;&#039;&#039; tab on the right-hand edge of the editor.&lt;br /&gt;
&lt;br /&gt;
== Getting sound out of it ==&lt;br /&gt;
&lt;br /&gt;
# Assemble your program.&lt;br /&gt;
# Press &#039;&#039;&#039;Load Current Build&#039;&#039;&#039; in the Program section.  The state indicator changes from &#039;&#039;Not loaded&#039;&#039;.&lt;br /&gt;
# Choose an input under &#039;&#039;&#039;Input Source&#039;&#039;&#039;.&lt;br /&gt;
# Press &#039;&#039;&#039;Play&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Leave &#039;&#039;&#039;Reload simulator on each assemble&#039;&#039;&#039; ticked and every successful build drops straight into the running simulator without interrupting playback.  This is the fast way to work: edit, assemble, listen, repeat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reset&#039;&#039;&#039; stops playback and clears delay memory.  Reach for it when a program has filled the delay line with something horrible and you want a clean start.&lt;br /&gt;
&lt;br /&gt;
== Input sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Source !! Good for&lt;br /&gt;
|-&lt;br /&gt;
| Sine tone || Filters, pitch effects, anything where you need to hear one frequency clearly.  The frequency slider covers 20 Hz to 8 kHz.&lt;br /&gt;
|-&lt;br /&gt;
| Sawtooth / Square || Harmonically rich material — filters and distortion show their character better than on a sine.&lt;br /&gt;
|-&lt;br /&gt;
| White noise || Filter shapes and reverb tails.&lt;br /&gt;
|-&lt;br /&gt;
| Audio file || Load a guitar DI or drum loop and hear the effect in context.&lt;br /&gt;
|-&lt;br /&gt;
| Live input || Play into it through your audio interface.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pots ==&lt;br /&gt;
&lt;br /&gt;
The three sliders map to &#039;&#039;&#039;POT0&#039;&#039;&#039;, &#039;&#039;&#039;POT1&#039;&#039;&#039; and &#039;&#039;&#039;POT2&#039;&#039;&#039; exactly as the physical controls do on the pedal, and they update while the program is running.  If your algorithm reads &amp;lt;code&amp;gt;POT0&amp;lt;/code&amp;gt;, moving the slider changes it live.&lt;br /&gt;
&lt;br /&gt;
== Levels ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Input&#039;&#039;&#039; and &#039;&#039;&#039;Output&#039;&#039;&#039; trim the signal either side of the simulated chip, in dB.  Input defaults to −6 dB.&lt;br /&gt;
&lt;br /&gt;
This matters more than it sounds.  The FV-1&#039;s accumulator saturates, and the simulator models that saturation, so an input that is too hot will clip inside your algorithm in the same way it would on hardware.  If something sounds unexpectedly crunchy, pull the input level down before you go hunting for a bug in your code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bypass&#039;&#039;&#039; passes the dry signal through so you can A/B against the effect.&lt;br /&gt;
&lt;br /&gt;
== The crystal setting ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Clock&#039;&#039;&#039; section changes the rate the simulated chip runs at, the same way swapping the crystal does on real hardware.  The standard FV-1 clock is 32.768 kHz.&lt;br /&gt;
&lt;br /&gt;
Your program does not change — it still runs 128 instructions per sample.  What changes is everything measured in samples:&lt;br /&gt;
&lt;br /&gt;
* Delay times scale with the clock.  The FV-1 has a fixed 32768 words of delay memory, so a faster clock buys you proportionally &#039;&#039;less&#039;&#039; delay time.  The readout under the selector shows the maximum delay and Nyquist frequency for the rate you have chosen.&lt;br /&gt;
* LFO sweeps scale too, so a chorus tuned at 32.768 kHz will modulate faster at 48 kHz.&lt;br /&gt;
&lt;br /&gt;
Changing the crystal rebuilds the audio engine, which clears delay memory.&lt;br /&gt;
&lt;br /&gt;
== What the model does and does not get right ==&lt;br /&gt;
&lt;br /&gt;
The simulator is faithful about the things that give the FV-1 its character:&lt;br /&gt;
&lt;br /&gt;
* 24-bit accumulator saturation.&lt;br /&gt;
* The 14-bit companded delay memory — the reason FV-1 delays sound the way they do.&lt;br /&gt;
* LFO rates and depths, following the equations in Spin&#039;s application note AN-0001.&lt;br /&gt;
&lt;br /&gt;
One approximation to know about: the fractional interpolation inside &amp;lt;code&amp;gt;CHO&amp;lt;/code&amp;gt; is approximated rather than modelled exactly.  Chorus and flange will sound right, but they will not match hardware sample for sample.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Always confirm a design on the real pedal before you ship it.&#039;&#039;&#039;  The simulator is for iterating quickly, not for signing off.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Using the Sandbox FV-1 Editor]]&lt;br /&gt;
* [[Writing your first FV-1 program]]&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Using_the_Sandbox_FV-1_Editor&amp;diff=16</id>
		<title>Using the Sandbox FV-1 Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Using_the_Sandbox_FV-1_Editor&amp;diff=16"/>
		<updated>2026-08-23T23:53:24Z</updated>

		<summary type="html">&lt;p&gt;Matthew: Add how-to guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Sandbox FV-1 Editor is a browser-based code editor, assembler and simulator for the Spin FV-1.  Nothing is installed and nothing is uploaded — the assembler runs entirely in your browser.&lt;br /&gt;
&lt;br /&gt;
Open it at [https://fv1.sandboxpedal.com fv1.sandboxpedal.com].&lt;br /&gt;
&lt;br /&gt;
== Browser requirements ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! What you want to do !! Browser&lt;br /&gt;
|-&lt;br /&gt;
| Write and assemble code || Any modern browser&lt;br /&gt;
|-&lt;br /&gt;
| Run the simulator || Any browser with AudioWorklet support&lt;br /&gt;
|-&lt;br /&gt;
| Save straight to hardware, or use a project folder || &#039;&#039;&#039;Chrome or Edge only&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Firefox and Safari do not implement the File System Access API, so they cannot write files to your pedal&#039;s drive.  You can still assemble and download a HEX file by hand and copy it across yourself.&lt;br /&gt;
&lt;br /&gt;
If Chrome refuses to talk to your hardware, see [[Troubleshooting]] for the site permission settings.&lt;br /&gt;
&lt;br /&gt;
== The layout ==&lt;br /&gt;
&lt;br /&gt;
The main window has a &#039;&#039;&#039;Source Input&#039;&#039;&#039; pane with the code editor and a &#039;&#039;&#039;Build Results&#039;&#039;&#039; pane underneath showing the assembled Intel HEX output.  Three tabs along the edge open flyout panels:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OPTIONS&#039;&#039;&#039; — editor preferences and hardware setup.&lt;br /&gt;
* &#039;&#039;&#039;HELP&#039;&#039;&#039; — the FV-1 instruction set reference.&lt;br /&gt;
* &#039;&#039;&#039;SIM&#039;&#039;&#039; — the [[Using the FV-1 simulator|built-in simulator]].&lt;br /&gt;
&lt;br /&gt;
== Assembling code ==&lt;br /&gt;
&lt;br /&gt;
Write or load your source, then press &#039;&#039;&#039;Assemble&#039;&#039;&#039; (or Alt+A on Windows, Ctrl+A on Mac).&lt;br /&gt;
&lt;br /&gt;
Warnings and errors appear in the message area with the line number.  The FV-1 has a hard limit of 128 instructions; anything shorter is padded out with NOPs automatically, so you do not need to fill the space yourself.&lt;br /&gt;
&lt;br /&gt;
Once a build succeeds you can save it in several formats:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Download HEX&#039;&#039;&#039; — Intel HEX, the format the programmer wants.&lt;br /&gt;
* &#039;&#039;&#039;Download Binary&#039;&#039;&#039; — raw &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Download C Headers&#039;&#039;&#039; — the program as a C array, for embedding in other firmware.&lt;br /&gt;
* &#039;&#039;&#039;Save Source…&#039;&#039;&#039; — your assembly source.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Load File…&#039;&#039;&#039; opens a source file from disk, and also offers four built-in examples: Pass-through, Delay, Chorus and Tremolo.  These are a good starting point if you want something working in front of you before you start editing.&lt;br /&gt;
&lt;br /&gt;
== Sending a build to the pedal ==&lt;br /&gt;
&lt;br /&gt;
This is the part that needs Chrome or Edge.&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;&#039;OPTIONS&#039;&#039;&#039; panel.&lt;br /&gt;
# Under &#039;&#039;&#039;Hardware Options&#039;&#039;&#039;, press &#039;&#039;&#039;Select Output Directory&#039;&#039;&#039; and choose your pedal&#039;s &#039;&#039;&#039;SANDBOX-FV1&#039;&#039;&#039; drive.&lt;br /&gt;
# Pick a destination from the &#039;&#039;&#039;Filename / Toggle Position&#039;&#039;&#039; grid.  The buttons are labelled by physical switch position — ▲ is switch up, ● is middle, ▼ is down — with the slot number in the middle.&lt;br /&gt;
# Assemble, then press &#039;&#039;&#039;Download to Hardware&#039;&#039;&#039; (Alt+D / Ctrl+D).&lt;br /&gt;
&lt;br /&gt;
The editor writes the HEX file into the drive under the right filename, the programmer picks it up, and the FV-1 reloads.  See [[Programming an EEPROM with HEX files]] for what happens at the hardware end.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Download to Hardware&#039;&#039;&#039; stays greyed out until all three of a directory, a filename and a successful build are in place.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Clear Hardware&#039;&#039;&#039; (Alt+C / Ctrl+C) writes empty files over &amp;lt;code&amp;gt;0.hex&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;7.hex&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;all.hex&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;dump.txt&amp;lt;/code&amp;gt;, wiping the slots.  It only touches files that currently have content.&lt;br /&gt;
&lt;br /&gt;
== Working from a project folder ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Select Project Folder&#039;&#039;&#039; in the Editor Options section points the editor at a directory of source files, so you can move between the files of a multi-program project without opening each one through a file dialog.&lt;br /&gt;
&lt;br /&gt;
== Editor options ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Large editor window&#039;&#039;&#039; — a taller code pane.&lt;br /&gt;
* &#039;&#039;&#039;Show editor mini-map&#039;&#039;&#039; — the Monaco overview strip down the right-hand side.&lt;br /&gt;
* &#039;&#039;&#039;Show full build results&#039;&#039;&#039; — verbose assembler output rather than just errors.  Useful when you are debugging an instruction encoding.&lt;br /&gt;
* &#039;&#039;&#039;Theme&#039;&#039;&#039; — System, Light or Dark.&lt;br /&gt;
&lt;br /&gt;
These preferences persist between sessions.&lt;br /&gt;
&lt;br /&gt;
== Keyboard shortcuts ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Action !! Windows !! Mac&lt;br /&gt;
|-&lt;br /&gt;
| Find || Ctrl+F || ⌘+F&lt;br /&gt;
|-&lt;br /&gt;
| Replace || Ctrl+Shift+F || ⌘+⌥+F&lt;br /&gt;
|-&lt;br /&gt;
| Find next || F3 || F3&lt;br /&gt;
|-&lt;br /&gt;
| Assemble || Alt+A || ⌃+A&lt;br /&gt;
|-&lt;br /&gt;
| Download to Hardware || Alt+D || ⌃+D&lt;br /&gt;
|-&lt;br /&gt;
| Clear Hardware || Alt+C || ⌃+C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Running the editor locally ==&lt;br /&gt;
&lt;br /&gt;
The web app must be served over HTTP.  Opening &amp;lt;code&amp;gt;Assembler/index.html&amp;lt;/code&amp;gt; as a &amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt; page will not work — browsers block the audio engine the simulator needs from &amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt; origins, and the directory and serial access need a secure context.  &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; counts as secure, so any static file server will do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 -m http.server 8000 --directory Assembler&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then open &amp;lt;code&amp;gt;http://localhost:8000&amp;lt;/code&amp;gt;.  If you prefer Node, &amp;lt;code&amp;gt;npx serve Assembler&amp;lt;/code&amp;gt; works the same way.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Writing your first FV-1 program]]&lt;br /&gt;
* [[Using the FV-1 simulator]]&lt;br /&gt;
* [[Programming an EEPROM with HEX files]]&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Programming_an_EEPROM_with_HEX_files&amp;diff=15</id>
		<title>Programming an EEPROM with HEX files</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Programming_an_EEPROM_with_HEX_files&amp;diff=15"/>
		<updated>2026-08-23T23:53:23Z</updated>

		<summary type="html">&lt;p&gt;Matthew: Add how-to guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Once the [[Installing the RP2040 programmer firmware|programmer firmware is installed]], writing a new algorithm to your pedal means copying a file onto a USB drive.  There is no software to launch and no driver to install.&lt;br /&gt;
&lt;br /&gt;
== Quick version ==&lt;br /&gt;
&lt;br /&gt;
# Plug the RP2040 board into USB.  A drive named &#039;&#039;&#039;SANDBOX-FV1&#039;&#039;&#039; appears.&lt;br /&gt;
# Connect the target 24LC32A EEPROM to the I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C pins.&lt;br /&gt;
# Drop a HEX file onto the drive, named for the slot you want (&amp;lt;code&amp;gt;0.hex&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;7.hex&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;all.hex&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Watch the LED: dim blue while writing, green on success, blinking red on error.&lt;br /&gt;
&lt;br /&gt;
On success the programmer pulses the FV-1&#039;s control pin so the chip reloads immediately.  You do not need to power-cycle the pedal.&lt;br /&gt;
&lt;br /&gt;
== Naming the file ==&lt;br /&gt;
&lt;br /&gt;
The filename is not cosmetic — it is how you choose which of the eight FV-1 program slots gets written.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Filename !! EEPROM address !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0000&amp;lt;/code&amp;gt; || On a Sandbox pedal this slot is bypass&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;1.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0200&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0400&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;3.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0600&amp;lt;/code&amp;gt; || Also the destination for any unrecognised filename&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;4.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0800&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;5.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0A00&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;6.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0C00&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;7.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0E00&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A file with any other name is written to &amp;lt;code&amp;gt;0x0600&amp;lt;/code&amp;gt; — program 3.  That is deliberate: program 3 is the slot the FV-1 selects when no toggle switches are fitted to the PCB, so a bare board with a single algorithm on it just works.&lt;br /&gt;
&lt;br /&gt;
== Toggle switch positions ==&lt;br /&gt;
&lt;br /&gt;
If your pedal has the two toggle switches fitted, the switch positions map to slots like this:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Right switch up !! Right switch down&lt;br /&gt;
|-&lt;br /&gt;
! Left switch up&lt;br /&gt;
| &amp;lt;code&amp;gt;2.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Left switch middle&lt;br /&gt;
| &amp;lt;code&amp;gt;3.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Left switch down&lt;br /&gt;
| &amp;lt;code&amp;gt;1.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The [[Using the Sandbox FV-1 Editor|editor]] shows the same grid, so you can pick the physical switch position you want rather than remembering slot numbers.&lt;br /&gt;
&lt;br /&gt;
== File format rules ==&lt;br /&gt;
&lt;br /&gt;
The programmer validates every file before it writes anything.  A file that fails validation is rejected outright — it will not half-program your chip.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Single-slot files&#039;&#039;&#039; (anything except &amp;lt;code&amp;gt;all.hex&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* Exactly &#039;&#039;&#039;129 lines&#039;&#039;&#039;.&lt;br /&gt;
* Address range &#039;&#039;&#039;0x000–0x1FF&#039;&#039;&#039; — 512 bytes, which is one FV-1 program.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Full-image files&#039;&#039;&#039; (&amp;lt;code&amp;gt;all.hex&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* Exactly &#039;&#039;&#039;1025 lines&#039;&#039;&#039;.&lt;br /&gt;
* Address range &#039;&#039;&#039;0x000–0xFFF&#039;&#039;&#039; — the whole 4096-byte chip.&lt;br /&gt;
* The EEPROM is cleared to &amp;lt;code&amp;gt;0xFF&amp;lt;/code&amp;gt; first, then written from &amp;lt;code&amp;gt;0x0000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* If &amp;lt;code&amp;gt;all.hex&amp;lt;/code&amp;gt; is present it is processed &#039;&#039;&#039;first and alone&#039;&#039;&#039;.  Other HEX files dropped in the same batch are skipped that cycle, so do not mix a full image with single slots.&lt;br /&gt;
&lt;br /&gt;
These line counts are what the assembler produces naturally.  If your file is the wrong length, it almost certainly did not come from an FV-1 assembler.&lt;br /&gt;
&lt;br /&gt;
== Reading the status indicators ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RGB LED:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Colour !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| Off || Idle, waiting&lt;br /&gt;
|-&lt;br /&gt;
| Dim blue || Writing&lt;br /&gt;
|-&lt;br /&gt;
| Green || Write succeeded&lt;br /&gt;
|-&lt;br /&gt;
| Blinking red || Error — check the serial console for the reason&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OLED display&#039;&#039;&#039; (production programmer only):&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;No target / Connect EEPROM&amp;lt;/code&amp;gt; — nothing detected on the I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C bus.&lt;br /&gt;
* &amp;lt;code&amp;gt;EEPROM found / Waiting for .hex&amp;lt;/code&amp;gt; — ready.&lt;br /&gt;
* &amp;lt;code&amp;gt;Complete / Waiting for .hex&amp;lt;/code&amp;gt; — the last write succeeded.&lt;br /&gt;
&lt;br /&gt;
After about 20 seconds of inactivity a screensaver bounces an &amp;quot;FV-1 PROG&amp;quot; label around the display.  Press the button to dismiss it; it is not an error state.&lt;br /&gt;
&lt;br /&gt;
== Re-flashing the same file ==&lt;br /&gt;
&lt;br /&gt;
The programmer remembers which files it has already handled in the current session, so dropping an unchanged &amp;lt;code&amp;gt;2.hex&amp;lt;/code&amp;gt; a second time does nothing.  To force a re-flash, disconnect and reconnect the EEPROM — that clears the processed list.&lt;br /&gt;
&lt;br /&gt;
After a successful write the programmer also creates a marker file such as &amp;lt;code&amp;gt;0.hex.programmed&amp;lt;/code&amp;gt;.  It is purely a record and is safe to delete.&lt;br /&gt;
&lt;br /&gt;
== Common failures ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! Likely cause&lt;br /&gt;
|-&lt;br /&gt;
| Stuck on &amp;lt;code&amp;gt;Connect EEPROM&amp;lt;/code&amp;gt; || EEPROM not seen on I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C.  Check wiring and that the chip answers at address &amp;lt;code&amp;gt;0x50&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BAD LINE COUNT&amp;lt;/code&amp;gt; || Not 129 lines (single slot) or 1025 lines (&amp;lt;code&amp;gt;all.hex&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BAD ADDR RANGE&amp;lt;/code&amp;gt; || The HEX addresses do not match the expected range for that slot.&lt;br /&gt;
|-&lt;br /&gt;
| Red blink at startup || I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C bus locked, or no EEPROM present during the initial scan.&lt;br /&gt;
|-&lt;br /&gt;
| File copied, nothing happens || The file is a dotfile, is zero bytes, or was already processed this session.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A zero-byte HEX file is ignored but still marked as processed.  This is how the editor&#039;s &#039;&#039;&#039;Clear Hardware&#039;&#039;&#039; button works — it writes empty files over the slots.&lt;br /&gt;
&lt;br /&gt;
macOS users: Finder likes to write hidden &amp;lt;code&amp;gt;._&amp;lt;/code&amp;gt; companion files onto removable drives.  The programmer ignores dotfiles, so these are harmless.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Installing the RP2040 programmer firmware]]&lt;br /&gt;
* [[Using the Sandbox FV-1 Editor]]&lt;br /&gt;
* [[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Installing_the_RP2040_programmer_firmware&amp;diff=14</id>
		<title>Installing the RP2040 programmer firmware</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Installing_the_RP2040_programmer_firmware&amp;diff=14"/>
		<updated>2026-08-23T23:53:21Z</updated>

		<summary type="html">&lt;p&gt;Matthew: Add how-to guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Sandbox programmer is an off-the-shelf RP2040 board running [https://circuitpython.org CircuitPython] plus a few files from the Sandbox repository.  Once it is set up, programming an FV-1 pedal is a matter of dragging a HEX file onto a USB drive — there is no driver to install and no programming application to run.&lt;br /&gt;
&lt;br /&gt;
This guide covers installing the firmware.  For day-to-day use, see [[Programming an EEPROM with HEX files]].&lt;br /&gt;
&lt;br /&gt;
== What you need ==&lt;br /&gt;
&lt;br /&gt;
* An RP2040 board.  We use a &#039;&#039;&#039;Waveshare RP2040-Zero&#039;&#039;&#039; for its small size and USB-C port, but a Raspberry Pi Pico or a clone will also work.&lt;br /&gt;
* A USB cable that carries data.  Charge-only cables are a common cause of &amp;quot;nothing happens when I plug it in&amp;quot;.&lt;br /&gt;
* The firmware files from the [https://github.com/DisasterAreaDesigns/Sandbox-FV1 Sandbox-FV1 repository], in the &amp;lt;code&amp;gt;Firmware&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
== Which firmware folder do I want? ==&lt;br /&gt;
&lt;br /&gt;
The repository contains two builds of the same programmer:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Folder !! Use it for&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Firmware/src&amp;lt;/code&amp;gt; || The programmer module fitted to a Sandbox pedal.  This is the one most people want.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Firmware/production programmer&amp;lt;/code&amp;gt; || A standalone bench programmer with an SSD1306 OLED and a button, for programming EEPROMs in quantity.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both share the same file layout and the same HEX file rules.  The production build adds the OLED status display.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Put the board into bootloader mode ==&lt;br /&gt;
&lt;br /&gt;
# Unplug the RP2040 board from everything.&lt;br /&gt;
# Hold down the &#039;&#039;&#039;BOOTSEL&#039;&#039;&#039; button on the board.&lt;br /&gt;
# While still holding BOOTSEL, plug the USB cable into your computer.&lt;br /&gt;
# Release the button.&lt;br /&gt;
&lt;br /&gt;
A removable drive named &#039;&#039;&#039;RPI-RP2&#039;&#039;&#039; will appear on your computer.  If it does not, the cable is the first thing to suspect.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Install CircuitPython ==&lt;br /&gt;
&lt;br /&gt;
Drag the CircuitPython &amp;lt;code&amp;gt;.uf2&amp;lt;/code&amp;gt; file onto the &#039;&#039;&#039;RPI-RP2&#039;&#039;&#039; drive.  The repository ships a known-good build as &amp;lt;code&amp;gt;Firmware/firmware.uf2&amp;lt;/code&amp;gt;; alternatively download the CircuitPython build for your specific board from [https://circuitpython.org/downloads circuitpython.org].&lt;br /&gt;
&lt;br /&gt;
The board reboots on its own as soon as the copy finishes — the RPI-RP2 drive disappearing is expected and is how you know it worked.  A new drive named &#039;&#039;&#039;CIRCUITPY&#039;&#039;&#039; appears in its place.&lt;br /&gt;
&lt;br /&gt;
== Step 3: Copy the Sandbox files ==&lt;br /&gt;
&lt;br /&gt;
Copy these four items from the firmware folder onto the &#039;&#039;&#039;CIRCUITPY&#039;&#039;&#039; drive:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;boot.py&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;code.py&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;hardware_id.json&amp;lt;/code&amp;gt;&lt;br /&gt;
* the &amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt; folder&lt;br /&gt;
&lt;br /&gt;
If your computer asks whether to merge or replace the contents of &amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt;, say yes.  CircuitPython ships its own &amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt; folder and the Sandbox libraries need to sit alongside whatever is already there.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hardware_id.json&amp;lt;/code&amp;gt; is what lets the web editor recognise the drive as a real Sandbox target, so do not skip it.&lt;br /&gt;
&lt;br /&gt;
== Step 4: Confirm it worked ==&lt;br /&gt;
&lt;br /&gt;
Eject the drive and re-plug the board.  Two things should change:&lt;br /&gt;
&lt;br /&gt;
* The drive is now named &#039;&#039;&#039;SANDBOX-FV1&#039;&#039;&#039; instead of CIRCUITPY.  &amp;lt;code&amp;gt;boot.py&amp;lt;/code&amp;gt; renames it at power-on.&lt;br /&gt;
* The board identifies itself over USB as &#039;&#039;Disaster Area Designs SandboxFV1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If you still see CIRCUITPY, &amp;lt;code&amp;gt;boot.py&amp;lt;/code&amp;gt; did not run.  Check that it is in the root of the drive and not inside a subfolder.&lt;br /&gt;
&lt;br /&gt;
== What the two files do ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;boot.py&amp;lt;/code&amp;gt; runs once at power-on, before anything else.  It sets the drive label, enables the USB drive, and sets the USB manufacturer and product identity (VID &amp;lt;code&amp;gt;0x1209&amp;lt;/code&amp;gt;, PID &amp;lt;code&amp;gt;0x3811&amp;lt;/code&amp;gt;).  You never interact with it directly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;code.py&amp;lt;/code&amp;gt; is the main loop.  It watches the I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C bus for an EEPROM and the drive for HEX files, and programs the chip when it finds both.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;code&amp;gt;boot.py&amp;lt;/code&amp;gt; remounts the filesystem read-only &#039;&#039;to the board&#039;s own code&#039;&#039;.  Your computer keeps write access, which is exactly what makes drag-and-drop programming work.&lt;br /&gt;
&lt;br /&gt;
== Reading the serial console ==&lt;br /&gt;
&lt;br /&gt;
For detailed logs — validation results, byte dumps, the reason a write failed — open the board&#039;s serial REPL with a terminal program such as &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tio&amp;lt;/code&amp;gt;, PuTTY or the Mu editor.  Every action the loop takes is printed there.  This is the fastest way to diagnose a write that goes red for no obvious reason.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Programming an EEPROM with HEX files]]&lt;br /&gt;
* [[Building the FV-1 Sandbox pedal]]&lt;br /&gt;
* [[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=How-to_guides&amp;diff=13</id>
		<title>How-to guides</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=How-to_guides&amp;diff=13"/>
		<updated>2026-08-23T23:53:20Z</updated>

		<summary type="html">&lt;p&gt;Matthew: Add how-to guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page collects the step-by-step guides for building, programming and coding the FV-1 Sandbox.&lt;br /&gt;
&lt;br /&gt;
If you are starting from nothing, work through them in this order.&lt;br /&gt;
&lt;br /&gt;
== Getting the hardware running ==&lt;br /&gt;
&lt;br /&gt;
* [[Building the FV-1 Sandbox pedal]] — where to find the PCB, schematic and firmware files.&lt;br /&gt;
* [[Installing the RP2040 programmer firmware]] — turn a bare RP2040 board into a Sandbox programmer.&lt;br /&gt;
* [[Programming an EEPROM with HEX files]] — drag a HEX file onto a drive and your pedal reloads.&lt;br /&gt;
&lt;br /&gt;
== Writing code ==&lt;br /&gt;
&lt;br /&gt;
* [[Using the Sandbox FV-1 Editor]] — the browser-based code editor and assembler.&lt;br /&gt;
* [[Writing your first FV-1 program]] — from pass-through to a working tremolo.&lt;br /&gt;
* [[Using the FV-1 simulator]] — hear an algorithm before you program hardware.&lt;br /&gt;
&lt;br /&gt;
== When something goes wrong ==&lt;br /&gt;
&lt;br /&gt;
* [[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://fv1.sandboxpedal.com FV-1 Sandbox Pedal Editor]&lt;br /&gt;
* [https://fxcore.sandboxpedal.com FXCore Sandbox Pedal Editor]&lt;br /&gt;
* [https://github.com/DisasterAreaDesigns/Sandbox-FV1 Sandbox-FV1 on GitHub]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Main_Page&amp;diff=9</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Main_Page&amp;diff=9"/>
		<updated>2025-08-17T13:38:37Z</updated>

		<summary type="html">&lt;p&gt;Matthew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;Welcome to Sandbox Pedal!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Knowledge Base for DSP Guitar Pedal DIY.&lt;br /&gt;
&lt;br /&gt;
What is Sandbox?  It&#039;s an open-source hardware and software package that allows for digital pedal DIY.  It uses the Spin Semiconductor FV-1 digital signal processing (DSP) integrated circuit and an off-the-shelf RP2040 microcontroller board, and presents the user with the simplest possible way to get started.&lt;br /&gt;
&lt;br /&gt;
# Write your signal processing code or find some cool code from another user.&lt;br /&gt;
# Use our code editor to assemble into a HEX file.&lt;br /&gt;
# Drag the HEX file into the Sandbox FV-1 pedal.&lt;br /&gt;
# Play.&lt;br /&gt;
&lt;br /&gt;
No drivers to install.  No operating system requirements.  No need to be tied to any particular hardware.  If you don&#039;t want to buy anything from us, that&#039;s okay - we made it all free anyway.&lt;br /&gt;
&lt;br /&gt;
The bare minimum thing you&#039;ll need is an RP2040 board like a RP2040-Zero or Raspberry Pi Pico.  These are open-source microcontrollers with a USB port and lots of pins you can use to interface with the outside world.  Connect it to your computer, drag our firmware into the board, then hook up a couple of wires to the EEPROM in your pedal.  Drag a HEX file into the RP2040 and the EEPROM will program automatically.  You don&#039;t need any drivers, no software, nothing but the normal file explorer / Finder / file manager application on your computer.&lt;br /&gt;
&lt;br /&gt;
Why do we need this?  Honestly, we don&#039;t.  There are plenty of other ways to get started with DSP, including several other FV-1 based projects.  Go ahead and try some of them out.&lt;br /&gt;
&lt;br /&gt;
[https://www.pedalpcb.com/product/fv1dev/ PedalPCB FV-1 DEV] &lt;br /&gt;
&lt;br /&gt;
* Requires building a PCB including two 28-pin surface-mount ICs.&lt;br /&gt;
* Requires command-line tools for Mac / Linux.&lt;br /&gt;
* Programming software needs .BIN files instead of native FV-1 HEX.&lt;br /&gt;
* Works best on Windows but limited / basic Mac / Linux support.&lt;br /&gt;
* Requires at least two applications to work (FV-1 assembler or SpinCAD and AsProgrammer or CLI tools)&lt;br /&gt;
* Base hardware is mono in and out&lt;br /&gt;
&lt;br /&gt;
Okay, I see you&#039;re back!  How was that experience?  A little cryptic, maybe?  You need to install some drivers, or maybe update your Python install, something like that?  Then you need to build a pedal from a kit and maybe that doesn&#039;t work first time, sure, we get it.&lt;br /&gt;
&lt;br /&gt;
We&#039;re trying to remove as much friction as possible, and that starts with good tools.  Ask your granddad about good tools vs. cheap tools and you&#039;ll probably hear something like &amp;quot;buy it nice or buy it twice,&amp;quot; and that definitely agrees with our findings.&lt;br /&gt;
&lt;br /&gt;
Making a chorus algorithm isn&#039;t harder than swapping diodes in a Tube Screamer, but the current state of the industry makes it &#039;&#039;seem&#039;&#039; a lot more difficult&#039;&#039;.&#039;&#039;  Starting DSP isn&#039;t hard, but there are a lot of steps and every single one of them has a path to failure.&lt;br /&gt;
&lt;br /&gt;
The traditional way of getting started with FV-1 was to buy the official development board (US$120) from Spin Semiconductor, then use their SpinASM IDE program on a Windows computer to develop and deploy your algorithms.  The dev board has RCA inputs and isn&#039;t particularly guitar-friendly, so you really need some extra hardware to get something that&#039;s closer to a real pedal.&lt;br /&gt;
&lt;br /&gt;
Once you have your algorithms, you need to burn them to an EEPROM for use with an actual pedal.  You can use the dev board to program EEPROMS but it&#039;s a bit clunky and you need the IDE to use it.  It&#039;s fine for one pedal but if you wanted to make 50 or 100 a standalone EEPROM programmer makes more sense.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://fv1.sandboxpedal.com FV-1 Sandbox Pedal Editor]&lt;br /&gt;
* [https://fxcore.sandboxpedal.com FXCore Sandbox Pedal Editor]&lt;br /&gt;
* [[Troubleshooting]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Main_Page&amp;diff=8</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Main_Page&amp;diff=8"/>
		<updated>2025-08-16T23:18:44Z</updated>

		<summary type="html">&lt;p&gt;Matthew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;Welcome to Sandbox!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Knowledge Base for DSP Guitar Pedal DIY.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://fv1.sandboxpedal.com FV-1 Sandbox Pedal Editor]&lt;br /&gt;
* [https://fxcore.sandboxpedal.com FXCore Sandbox Pedal Editor]&lt;br /&gt;
* [[Troubleshooting]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Troubleshooting&amp;diff=7</id>
		<title>Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Troubleshooting&amp;diff=7"/>
		<updated>2025-08-16T23:17:30Z</updated>

		<summary type="html">&lt;p&gt;Matthew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== USB devices not connecting in Chrome: ==&lt;br /&gt;
&lt;br /&gt;
Chrome requires permissions to access your USB-HID devices like Sandbox.  Here&#039;s how you can verify those permissions are correct.&lt;br /&gt;
&lt;br /&gt;
Open Chrome and select Settings &amp;gt; Privacy &amp;amp; Security &amp;gt; Site Settings &amp;gt; HID Devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:HID_privacy.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make sure that fxcore.sandboxpedal.com and fv1.sandboxpedal.com are allowed to access your HID devices.&lt;br /&gt;
&lt;br /&gt;
[[File:Hid_settings.png|thumb|center]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Troubleshooting&amp;diff=6</id>
		<title>Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Troubleshooting&amp;diff=6"/>
		<updated>2025-08-16T23:16:41Z</updated>

		<summary type="html">&lt;p&gt;Matthew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;USB devices not connecting in Chrome:&lt;br /&gt;
&lt;br /&gt;
Chrome requires permissions to access your USB-HID devices like Sandbox.  Here&#039;s how you can verify those permissions are correct.&lt;br /&gt;
&lt;br /&gt;
Open Chrome and select Settings &amp;gt; Privacy &amp;amp; Security &amp;gt; Site Settings &amp;gt; HID Devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:HID_privacy.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make sure that fxcore.sandboxpedal.com and fv1.sandboxpedal.com are allowed to access your HID devices.&lt;br /&gt;
&lt;br /&gt;
[[File:Hid_settings.png|thumb|center]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=File:HID_privacy.png&amp;diff=5</id>
		<title>File:HID privacy.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=File:HID_privacy.png&amp;diff=5"/>
		<updated>2025-08-16T23:07:03Z</updated>

		<summary type="html">&lt;p&gt;Matthew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=File:Hid_settings.png&amp;diff=4</id>
		<title>File:Hid settings.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=File:Hid_settings.png&amp;diff=4"/>
		<updated>2025-08-16T23:06:11Z</updated>

		<summary type="html">&lt;p&gt;Matthew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Troubleshooting&amp;diff=3</id>
		<title>Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Troubleshooting&amp;diff=3"/>
		<updated>2025-08-16T23:01:37Z</updated>

		<summary type="html">&lt;p&gt;Matthew: Created page with &amp;quot;USB devices not connecting in Chrome:  Chrome requires permissions to access your USB-HID devices like Sandbox.  Here&amp;#039;s how you can verify those permissions are correct.  Open Chrome and select Settings &amp;gt; Privacy &amp;amp; Security &amp;gt; Site Settings &amp;gt; HID Devices&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;USB devices not connecting in Chrome:&lt;br /&gt;
&lt;br /&gt;
Chrome requires permissions to access your USB-HID devices like Sandbox.  Here&#039;s how you can verify those permissions are correct.&lt;br /&gt;
&lt;br /&gt;
Open Chrome and select Settings &amp;gt; Privacy &amp;amp; Security &amp;gt; Site Settings &amp;gt; HID Devices&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Main_Page&amp;diff=2</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Main_Page&amp;diff=2"/>
		<updated>2025-08-16T22:38:56Z</updated>

		<summary type="html">&lt;p&gt;Matthew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;Welcome to Sandbox!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Knowledge Base for DSP Guitar Pedal DIY.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://fv1.sandboxpedal.com FV-1 Sandbox Pedal Editor]&lt;br /&gt;
* [https://fxcore.sandboxpedal.com FXCore Sandbox Pedal Editor]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
</feed>