Evaporator Regulator
This isn’t the most involved project but I might as well document it. I’ve been trying to automate some of the more boring tasks of running the evaporator, I’ve got some nice stainless steel float valves to regulate the sap going in now for example. One of the things that kept requiring constant attention is the air intake to adjust the strength of the fire. I’d have to sit with a foot on it to be able to regulate it almost constantly, to make sure the fire wasn’t burning too hard or too weak. And so naturally I thought I could do something with a Pi.
This proved quite successful even with very loose wiring and fastening just to see how it would work.
All of a sudden I barely need to pay attention to the fire’s strength, with a few refinements I won’t have to at all.
The circuit is quite simple:
Wifi barely reaches the sugarhouse so I made sure this could run independent of connectivity. Which involves coding threads on a Pi Pico, which is supported but not as one would expect.
import machine
import time
import network
import socket
from max6675 import MAX6675
import _thread
html = """{\"evaporator_temperature\":<TEMPERATURE>}"""
# LED
led = machine.Pin( "LED", machine.Pin.OUT )
# temperature
sck = machine.Pin( 2, machine.Pin.OUT )
cs = machine.Pin( 3, machine.Pin.OUT )
so = machine.Pin( 4, machine.Pin.IN )
sensor = MAX6675( sck, cs , so )
temperature_min = 25
temperature_max = 30
temperature = -1337.0
# servo
servo = machine.PWM( machine.Pin(0) )
servo.freq( 50 )
servo_min = 1000
servo_max = 8000
servo_at = 0
def temp_to_servo( temp ):
if (temperature_max - temperature_min)==0:
# right in the middle
return int( (servo_max-servo_min)/2 )
result = (temp - temperature_min) * (servo_max - servo_min) / (temperature_max - temperature_min) + servo_min
if result>servo_max:
result = servo_max
if result<servo_min:
result = servo_min
return int( result )
def blink_number( number ):
number = str( int(number) )
for char in number:
for i in range(int(char)):
led.value( 1 )
time.sleep( 0.2 )
led.value( 0 )
time.sleep( 0.2 )
time.sleep( 0.3 )
led.value( 1 )
time.sleep( 0.1 )
led.value( 0 )
time.sleep( 0.3 )
keep_going = False
def servo_thread():
global temperature, servo_at, servo
while keep_going:
time.sleep( 5 )
print( "# measuring average temperature over 1 seconds..." )
temperature_total = 0.0
for i in range(10):
temperature_total += sensor.read()
time.sleep( 0.1 )
temperature = temperature_total / 10
blink_number( temperature )
print( "# " + str(temperature) )
new_servo_position = temp_to_servo( temperature )
print( "# new_servo_position: " + str(new_servo_position) )
step = 1
if new_servo_position<servo_at:
step = -1
for i in range(servo_at, new_servo_position, step):
time.sleep( 0.001 )
servo_at = i
servo.duty_u16( i )
print( "# servo tread finishing" )
# main thread
servo.duty_u16( servo_min )
for i in range(servo_min, servo_max):
time.sleep( 0.001 )
servo_at = i
servo.duty_u16( i )
try:
ssid = "<wifi_ssid>"
password = "<wifi_password>"
wlan = network.WLAN( network.STA_IF )
wlan.active( True )
wlan.connect( ssid, password )
# wait for connect or fail
max_wait = 20
while max_wait>0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print( "> waiting for connection..." )
time.sleep( 1 )
# handle connection error
if wlan.status()!=3:
print( "> network connection failed, will launch servo thread in 1 minute" )
time.sleep( 60 )
print( "> launching" )
keep_going = True
_thread.start_new_thread(servo_thread, ())
while True:
time.sleep( 1 )
else:
print( "> connected" )
status = wlan.ifconfig()
print( "ip = " + status[0] )
# open socket
addr = socket.getaddrinfo( "0.0.0.0", 80)[0][-1]
s = socket.socket()
s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
#s.settimeout(1)
s.bind( addr )
s.listen( 1 )
print( "> web server listening on", addr )
# listen for connections
while True:
print( ">" )
try:
cl, addr = s.accept()
print( "client connected from", addr)
request = cl.recv( 1024 )
request = request.decode( "utf-8" ).strip()
print( request )
if request.startswith( "GET / " ):
print( "get data" )
response = html.replace( "<TEMPERATURE>", str(temperature) )
cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
cl.send( response )
elif request.startswith( "GET /min_temperature " ):
print( "get min_temperature" )
cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
cl.send( str(temperature_min) )
elif request.startswith( "GET /max_temperature " ):
print( "get max_temperature" )
cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
cl.send( str(temperature_max) )
elif request.startswith( "PUT /min_temperature " ):
print( "put min_temperature" )
new_min_temperature = int(request.split( "\r\n\r\n" )[1])
print( new_min_temperature )
temperature_min = new_min_temperature
cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
cl.send( "\"ok\"" )
elif request.startswith( "PUT /max_temperature " ):
print( "put max_temperature" )
new_max_temperature = int(request.split( "\r\n\r\n" )[1])
print( new_max_temperature )
temperature_max = new_max_temperature
cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
cl.send( "\"ok\"" )
elif request.startswith( "PUT /start " ):
print( "put start" )
cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
if keep_going:
print( " already started" )
cl.send( "\"already started\"" )
else:
keep_going = True
_thread.start_new_thread(servo_thread, ())
cl.send( "\"started\"" )
for i in range(5000, 6000):
time.sleep( 0.001 )
servo_at = i
servo.duty_u16( i )
elif request.startswith( "PUT /stop " ):
print( "put stop" )
#cl.send( "HTTP/1.0 501 OK\r\nContent-type: application/json\r\n\r\n" )
#cl.send( "\"not implemented\"" )
# crash on stop, thread support is that bad
cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
if keep_going:
keep_going = False
cl.send( "\"stopped\"" )
else:
print( " already stopped" )
cl.send( "\"already stopped\"" )
cl.close()
except OSError as e:
cl.close()
print( "> connection closed" )
keep_going = False
time.sleep( 2 )
except KeyboardInterrupt:
print( "> ctrl+c, wrapping up..." )
keep_going = False
time.sleep( 10 )
except Exception as e:
print( e )
print( "> unexpected exception, wrapping up..." )
keep_going = False
time.sleep( 10 )
import time
class MAX6675:
MEASUREMENT_PERIOD_MS = 220
def __init__(self, sck, cs, so):
"""
Creates new object for controlling MAX6675
:param sck: SCK (clock) pin, must be configured as Pin.OUT
:param cs: CS (select) pin, must be configured as Pin.OUT
:param so: SO (data) pin, must be configured as Pin.IN
"""
# Thermocouple
self._sck = sck
self._sck.low()
self._cs = cs
self._cs.high()
self._so = so
self._so.low()
self._last_measurement_start = 0
self._last_read_temp = 0
self._error = 0
def _cycle_sck(self):
self._sck.high()
time.sleep_us(1)
self._sck.low()
time.sleep_us(1)
def refresh(self):
"""
Start a new measurement.
"""
self._cs.low()
time.sleep_us(10)
self._cs.high()
self._last_measurement_start = time.ticks_ms()
def ready(self):
"""
Signals if measurement is finished.
:return: True if measurement is ready for reading.
"""
return time.ticks_ms() - self._last_measurement_start > MAX6675.MEASUREMENT_PERIOD_MS
def error(self):
"""
Returns error bit of last reading. If this bit is set (=1), there's problem with the
thermocouple - it can be damaged or loosely connected
:return: Error bit value
"""
return self._error
def read(self):
"""
Reads last measurement and starts a new one. If new measurement is not ready yet, returns last value.
Note: The last measurement can be quite old (e.g. since last call to `read`).
To refresh measurement, call `refresh` and wait for `ready` to become True before reading.
:return: Measured temperature
"""
# Check if new reading is available
if self.ready():
# Bring CS pin low to start protocol for reading result of
# the conversion process. Forcing the pin down outputs
# first (dummy) sign bit 15.
self._cs.low()
time.sleep_us(10)
# Read temperature bits 14-3 from MAX6675.
value = 0
for i in range(12):
# SCK should resemble clock signal and new SO value
# is presented at falling edge
self._cycle_sck()
value += self._so.value() << (11 - i)
# Read the TC Input pin to check if the input is open
self._cycle_sck()
self._error = self._so.value()
# Read the last two bits to complete protocol
for i in range(2):
self._cycle_sck()
# Finish protocol and start new measurement
self._cs.high()
self._last_measurement_start = time.ticks_ms()
self._last_read_temp = value * 0.25
return self._last_read_temp
We’re Boiling
The operations is smoother, the kids are older. Sugaring season is liminal time between Winter and Spring sitting by the evaporator for hours on end. Often prompting discussions we wouldn’t otherwise have. I love this time of the year very much.

Now this Winter has been more more “normal” for Vermont, and sugaring season started the week after Town Meeting day which is tradition I hear, but not anything we’re used to. Sap hit hard these past few days and we had to start boiling it off fast to make room for more.
PewtyBot 1.0
I’ve used this project as a stepping stone and modified it some. I can’t say enough good things about it, it propelled development forward significantly and I found it to be expertly designed. Too bad the project it now defunct. I had to find assembly documentation on archive.org.
I’m not sure I’ll document it as well as I have the tabletop plotter or the gondola one. At least not yet, maybe that’ll be a Christmas project like the other 2. I did port the same software stack, it would be a shame not to given the years of feature development that went into it. Of course we should use these features with lasers. It might also change drastically, I want to investigate what rotating mirrors could do for speed. Currently some of the moving parts of the machine have enough mass that their inertia causes inaccuracies when moving at high speed.
It’s nice to have things tidied up, the development machine was a mess.
Laser Pew Pew
I have yet to crack the math, I’ve been banging my head against the wall with various implementations but this is a lot worse than the Gondola’s double polar system. I’d like the laser to be able to project a cartesian system in any position relative to the surface it’s drawing on. Alas, I’ve only been able to get decent results in ideal positions.
For Posterity
The first successful prototype of PewtyBot.
Philip from Germany got in touch to tell me about a cool project he had seen that involved photoluminescent paper. He thought maybe PlottyBot could so something with it, and maybe it could, but not fast enough I thought. I knew exactly what I wanted to do with it though, with the PlottyBot software stack, but a different machine. I love that people get in touch to show me cool things. I’ve been working on plotters for years now, and in some sense it felt like I had turned every stone. Out of nowhere Philip got in touch and steered me toward a whole new area of exploration. Of course one can buy glow-in-the-dark paper, of course I can shoot lasers at it, of course all the algorithms I’ve been working on these past years lend themselves to this new endeavor. Well, with some tweaking :).
It was a real struggle to get Trinamic drivers working on a Pi, but I wanted to step up my motor stepping game. Once I figured it out, holy shit do they work! There’s much else to talk about here, but this isn’t the point of this post, I just want to capture the miletone that is shooting lasers super fast at photoluminescent paper. I still haven’t wrapped my mind around what this all means.
Runestone of Memory
I often contact artists to see if they’d like to do something public on the big plotter, and I’m often met with silence :). Sometimes though, I meet the rare characters who are completely fine doing something cool just because it’s cool, new, and takes their art in another dimension, oh and by the way there’s $0 to be made for either of us. I appreciate disinterested people, and Irish artist Patrick Boullier is such a person. He kindly provided a high resolution scan of his amazing piece: Runestone of Memory so I could try to turn that into penstrokes for the giant plotter. After several trials and help from Vectorizer.ai (top of the line for SVG tracing), I got somewhere we both felt was good, and so it ran on the big plotter for a week.

As is routine, the public reveal was preceded by several smaller scale trials.
This is an awesome piece on Norse mythology riddled with symbolism. I highly recommend reading the explanation of some of it (scroll down some).
XCSki
Ever trying to step up my trail game but it’s hard without the right equipment.

Hidden in Plain Sight (Cached in Full View), a Tale of Language, Power, and Probabilities
How’s that for an enticing title?
Disclaimer #1: I am neither a linguist nor a historian.
Disclaimer #2: nothing here about national pride of any kind.
Warning: wall of text, yes it’s one of those :).
As a kid learning English in French schools several decades ago, a simple fact about the language was never brought up once. We all learned complex new words, and because they were spelled a bit different, and they were pronounced oddly, we didn’t recognize them for what they were: French words we already knew.
The story goes something like this: the Vikings (North Men) settle Normandy and assimilate local culture & language. Power vacuum in England, Battle of Hastings, and the Normans find themselves the ruling class of England.
And from this we get the well known noble/servant language separation we’ve heard a thousand times: pork/pig, beef/cow, mutton/sheep, venison/deer. What took me much longer to realize however, is how deeply the languages are intertwined to this day, almost a thousand years later. This entanglement goes much further than a little factoid about animal & food names being class based.
To illustrate, it’s worth mentioning that on average a good 30% of English is French. Pick up a random article online and you’ll be able to map about 30% of the words to French origins. That without many etymological convolutions, if any at all.
Here’s a random, non-cherry-picked article article from the local Herald, with French word highlighted:
Large animal veterinarians have played an important role in the lives of farmers and horse handlers keeping animals healthy and being there through sickness and crisis.
I feel blessed to know two special veterinarians whose careers have spanned 40+ years in central Vermont.
Tom Stuwe and Will Barry both established practices around the same time with their own styles, techniques, and stories. These veterinarians have stood by so many in the farming community, through the thick and thin. With a sick animal weighing a thousand pounds or better, veterinarians are nothing short of heroes.
These two extraordinary veterinarians have recently retired.
These two vets to write about as they hold a special place in my heart. They are not only farm acquaintances, they have also become friends over the years.
The good news is that there are a handful of new large animal veterinarians that are starting up practices in central Vermont so our animals won’t be left without care.
What makes this exercise tricky is that some of these words come straight from Latin, and I won’t do a good job at distinguishing between the 2. As I said, I’m not a linguist. The fact remains that the English of today is the result of a large assimilation of language into Old English. Sometimes the same word are imported twice, these words doubly borrowed often take a slight nuance: take warranty and guarantee. Normans used the W sound where later rulers from central France used the Gu sound in its place. That is in fact how we got wasp, warrior, and William from guespe, guerrier, and Guillaume respectively. But I digress, it’s easy to considering how languages are the accumulation of a million cool little stories.
Cohabitation
Where languages often borrow from others to fill a gap, this particular linguistic assimilation resulted in both sides (French and Germanic) coexisting today within English. There is a fairly clear Venn diagram of words from either side, and most fascinating is where they overlap. French words often have a Germanic counter part, but depending on the register of language, one or the other will be used. And as with pork & beef, the higher the register, the Frencher the word. In all the examples I could find, there simply seems to be more gravity to the French alternative. Here are a few examples I’ve compiled over time. It’s by no means an exhaustive list, just what I stumbled upon:
| Germanic | French |
| business | occupation |
| wise | sage |
| woods | forest |
| freedom | liberty |
| dark | somber |
| underground | subterranean |
| landscaping | terraforming |
| wide | large |
| work | labor |
| fight | combat |
| snake | serpent |
| build | construct |
| lift | elevate |
| necklace | pendant |
| disbelief | incredulity |
| maze | labyrinth |
| barn | grange |
| foreseeable | previsible |
| overseer | supervisor |
| hindsight | retrospect |
| folder | directory |
| in love | enamored |
| hearable | audible |
| deep | profound |
| luck | chance |
| meaning | sense |
| answer | response |
| understand | comprehend |
| thoughtful | pensive |
| answer | response |
| child | infant |
| outside | exterior |
| road | route |
| building | construction |
| body | corps |
| top | summit |
| by hand | manually |
| strength | force |
| fall | autumn |
| undo | defeat |
| flood | inundate |
| allow | permit |
| seek | search |
| teenage | adolescent |
| gift | present |
| focus | concentration |
| king | monarch |
| guilty | culpable |
| shake | tremble |
| sing | chant |
| start | commence |
| instead | in lieu |
| maze | labyrinth |
| overcome | surpass |
| whisper | murmur |
| trip | voyage |
| embody | incarnate |
Both sides coexist and are perfectly usable, but one side will be preferred depending on the gravity level you seek. To illustrate this, I will say that landscaping is when you dig a hole in your yard, and terraforming is when you shape another planet for colonization. Both amount to a shovel in the ground, but one involves interstellar travel and the other your backyard and a beer. We can also say that the administration regimenting work is the department of labor. Or that you raise a barn but you elevate consciousness. In all these examples, you could swap the Germanic and French words for they are functionally equivalent, but the French version just seems to have more importance imbued in it.
As a fun exercise, to further illustrate, I tried to “translate” movie titles from their original titles, to their “Germanic English” counter parts. Can you imagine if:
Star Wars, the Phantom Menace was in fact called Star Wars, the Ghost Threat
sounds silly doesn’t it? Yet the meaning is exactly the same.
Or if:
E.T. The Extra Terrestrial was called O.E. The Outer Earther
Although this later example shows the limits of these alternate words. They might exist and be perfectly usable but they just sound too “off”, their meaning might have shifted to beyond usability as a drop-in replacement. You wouldn’t call “Gone with the Wind” “Departed with the Vent”. I mean you could, but that particular mapping yields a meaning different not just in gravity level. You can kind of see how gone is related to departed, and wind to vent, in fact those would be translations into French today, but in English they have shifted a bit.
Make English Great Encore (Anglish)
There exists a small movement to clean up English to only use Germanic origin words, and even push words which don’t currently exist into English. For example Vocabulary could become Wordstock, and Solar Panel could be Sun Board. I can’t say I’d be opposed to it, it was honestly a bit disappointing to go through great effort to master a language only to realize it was in retrospect quite close to your native tongue. And in general I appreciate the richness of diversity. Alas, languages tend to evolve in spite of conscious efforts to shape them. I do find myself picking more carefully between the 2 flavors when they are both available. I love English and have a penchant for words rooted in Old English, from my non-native perspective they convey more culture and history from beyond 1066, and the English language is my privileged view into that.
For example, I find it fascinating to find in language artifacts of how a culture sees the world. When you take the words happy, perhaps, mishap and happen, one can see in “hap” a deeper notion of chance. One which can be used to describe joy, potentiality, bad luck, and something coming to pass. I can kind of see it when I think about it, but to an Old English speaker, there was something more obvious there about how they interpreted the world.
Another great example that is challenging to a learner is the word bear. The many ways it can be used seems to indicate a world view where a baby being born is the same concept as bearing (carrying/wearing) something. I see it, your mom carried you around and this is now over so you’ve been born. But what kind of world view does it take to relate the deep human experience of childbirth, with the menial task of carrying something? I speculate here, but I think it’s a world in which people carried a lot more stuff by hand: wood, water, supplies. Carrying was important, omnipresent, manual, and closer in hardship to pregnancies than it is today. I think it’s fascinating how language today reflects a human experience from the depths of time.
Lastly, and because I just used it in the previous paragraph, the word wear links the notion of use with that of decay. You are ever reminded by language that the sheer act of wearing your favorite shirt implies its earlier demise. And again I find myself thinking of the ancient world in which these 2 notions are linked, likely one with more scarcity.
Translating without Learning
Here’s are a few tricks to translate French into English today without knowing a word of it
replace é by s:
- état – state
- écureuil – squirrel
- éponge – sponge
- étranger – stranger
- épice – spice
- étoile – star (a bit more far fetched)
- épinard – spinach (a bit more far fetched)
add an s after a ˆ
- tempête – tempest
- hôtesse – hostess
- maître – master
- coût – cost
- arrête – arrest
- hôpital – hospital
- pâte – paste
- huîstre – oyster
replace gu with w
- guerre – war
- guêpe – wasp
- guardien – warden
replace ch with c
- chat – cat
- chapeau – cap
- char – car
replace eu with o
- majeur – major
- interieur – interior
I’m sure there’s many more such tricks & examples, to me it was mind boggling to realize that a large fraction of English had little to no daylight with French. It’s a fact hidden in plain sight.
The Probabilities of it All
Well, I’m reaching the end of my observations here. I actually created this post several years ago when I first realized how far this entanglement went. I know this realization is not news to many, but it arrived late here, and I loved exploring it from the completely non-academic perspective of some dude going about his daily life in the U.S.. So I added to this post over the years as I ran into little nuggets of knowledge on the subject. And I am eager to put it behind me, I feel like I’ve gone around and turned the stones I wanted to turn. Particularly, I was interested in doing computation on corpora of English to answer several questions:
Do English & French converge, diverge or remain stable overtime and until today?
Can we see both poles (Germanic & French) in the language and how do they progress over time? Is a statistical loss for a pole a gain for the other? Do world events bring out one side over the other?
If we can associate “gravity” to the Frencher turns of phrases, can we also associate context (science, religion, spoken)? More slippery, can we associate ideology? Would a speech from a more socialist leaning person be statistically closer to French?
I launched into it and threw a lot at it. I used my Markov chain models as a statistical model to compare against. Given a previously analyzed probability distribution letter for French, Dutch, or German, I found various corpora of English to compare against them, only to find mitigated results… First it’s been harder than I thought to find decent corpora to analyze. I think I need more data, and so if you are still reading and have any recommendations for a nice clean corpus of data of a lot of English over a long time, please drop me a note. Another challenge has been that my previously analyzed probability distributions of languages were done on modern languages which included many poison pills of exchanged words ruining statistics. So I instead used Old French, Old Norse and Old English as my points of reference to compare against, I figured these would be “cleaner” from these exchanges. There again maybe what I really need is a good corpus of data from which I could parse word origin to remove these poison pills from my statistical models. This introduced an interesting concept which is obvious in retrospect:
English is evolving away from its Old self
The data analyzed above are news articles from the sample provided by COHA (I can’t justify spending the money on the full thing). On the vertical axis is a proximity grade that is of an arbitrary unit so the number isn’t meaningful except when related.
I suppose I should have expected English to keep evolving over time, but this downward progression makes for a more complex baseline.
Of course it is also evolving away from Old French (red) and Old Norse (orange):

So far we’ve learned nothing, and I don’t see many peaks and dips I could map to world events. But on the analysis of the U.S. State of the Union speeches you can see world wars, and it’s easy to speculate that concerns and word choices would be different in a time of war. I like the stability of this corpus, but I don’t like that a single president and his language predispositions could be single-handedly responsible for a peak or a dip.

I do wonder why the post WWI era seems more unstable than the pre, more speculation here but maybe that is a sign of an accelerating world. What we don’t find are zero sum swings between a Germanic and a French pole so that theory I had doesn’t work, but I’m honestly not sure why.
Lastly for ideology and context, I analyzed a few subreddits to give them that same grade against Old English, Old French and Old Norse. There does seem to be some correlation but it too isn’t as telling as I thought it might be.
All in all this statistical analysis isn’t as revelatory as I thought it would be which is a bit of a disappointment given how much I tried. Oh well, It still shows a couple of curious artifacts.
In conclusion, because it does feel like such a long post should be wrapped up with a paragraph starting with “in conclusion”, I will simply say that I’ve loved my journey into linguistics and culture through learning English. It is a beautiful language, and clearly the Lingua Franca of its time (double entendre very much intended).
Old Vinyls
A few years after we bought a small parcel of land right in the middle of our land, I thought enough time had passed I could probably pop my head in the decrepit house which sits on it. There’s lots of complicated things to say about stepping into the intimacy of a family’s home which became frozen in time. I won’t get into it whatsoever, but there’s a reason it took a long time to feel ok stepping in. While the main living quarters felt off limit for looking at anything but the bones of the house, the attic seemed to have several generations of various families’ memorabilia in it (and some decent rafters), and that felt sufficiently removed to be curious about. A stack of vinyls caught my eye, they just looked ancient and unlike any I had seen before. Searching around it looked like some were more than a century old, and so I pretty much had to get a turntable, and it was a bit surreal to hear these sounds from another world. The turntable was really well received by all of us beyond its ability to play old records. I understand why vinyls made a come back. It’s not just nostalgia, kids seem to appreciate having a tangible medium that holds music, and the ritual of playing it. And I love having one less reason be bombarded with choice on a screen.
So I’ll post them here on occasion, some are already archived in various places on the internet and aren’t exclusive. It doesn’t matter, here’s another copy.
I had to disable the limit switch on the turntable, these discs are anything but standard size.

Here is the Armorer’s song recorded in 1912, 112 years and 2 world wars ago. 1 song on 1 side, that’s all you get :).
No Pen up/down, No Precision
Still totally fun and I want a big one.




































