solhsa.com Open in urlscan Pro
65.21.188.148  Public Scan

URL: https://solhsa.com/
Submission: On August 06 via api from US — Scanned from FI

Form analysis 0 forms found in the DOM

Text Content

 Email  Mastodon  Discord  Ko-Fi  Cohost  Github  Linkedin  RSS

 General

 * News/Blog
 * Who?
 * Stories
 * Tutorials
 * Breakdown
 * Links
 * Stuff

 Speccy

 * 48k spectrum
 * ZX Spectrum Next

 Downloads

 * Code
 * Demos
 * Games
 * Audio
 * Misc files

 Minisites

 * SoLoud
 * FoodSofia
 * GalaXQL
 * Soundex broken telephone
 * Thesaurus broken telephone

 Meta

 *  Email
 *  Mastodon
 *  Discord
 *  Ko-Fi
 *  Cohost
 *  Github
 *  Linkedin
 *  RSS


BLOG


CHIPAS


JULY 27TH, 2024 (PERMALINK)

Several years ago, during a refugee crisis, one refugee center was placed in our
town. One side effect of this was that we had an influx of foreign foods. The
refugees would come to markets and sell food of their making, from their various
cultures. I liked trying out different things, and apparently so did a lot of
other people. When the govenment closed the refugee center (with most of the
refugees deported, as far as I understand), the locals protested.



Anyhoo, one of the foods was the chipa, south american cheese bread. It has an
amazing chewy mouth feel, and the cheesiness makes it rather addictive. Not like
drugs addictive, more like salt chips addictive.

I missed it enough to start researching how to make my own. The original recipes
require south american cheeses, but those are a bit hard to come by. Luckily
they can be substituted with hard italian cheeses.



Another bit was the flour - the recipe calls for tapioca flour which isn't
carried by the local stores, so I tried a few different substitutes, none of
which worked - tapioca is essential to the recipe. I eventually just ordered
tapioca starch online, and it's become easier to source since.

Amount Ingredient Note 800 g (two bags) Tapioca starch Or tapioca flour. Haven't
tried. 240 g Butter, melted 3 Eggs 16 g Salt 416 g Cheese See below 3 dl Milk I
used fat-free

The original recipe I have modified required 550g of tapioca starch, but I
scaled it to full bags because that's the most annoying ingredient to measure.
As a side effect, this two-bag recipe would require 3.2 eggs, but what's an egg,
exactly?

As far as I understand, if you manage to get your hands on actual tapioca flour
instead of starch, you can skip the milk.

For cheese, I've used a mix of mostly grana padano or parmesan and pecorino
romano, and a little bit (~30g) of aged cheddar. I've seen completely wild
variations of the recipe, some even using mozzarella, so your mileage may vary.
Wildly.

Prep time is around an hour, and makes a bunch of sets to freeze and prepare
quickly later.

Melt the butter, add the milk to the butter to cool it down - you don't want to
cook the eggs at this point. Shred the cheese finely using some kind of power
tool. Or by hand. But given the massive amount, you probably don't want to do it
by hand.

Mix all the ingredients in a large bowl. Be careful with the starch, it tends to
go everywhere. I've tried mixing the ingredients in different orders to minimize
the mess, but it doesn't really matter. Just don't mix boiling butter with raw
eggs.

Do the mixing by hand, folding over and over and over again until the mixture is
uniform, and then some more. If the mixture doesn't turn into play-doh like mass
and feels too dry, add a little bit of milk. Be careful though, as too much will
ruin it. Well, not ruin, exactly, but the resulting breads will become flatter.

After you're utterly fed up of folding, start rolling little balls - I'd say
meatball-sized but since meatballs can be, like, anything, who knows how big
your mental image of a meatball would be. Something that's convenient to roll
into a ball between your palms. Not too big, not too little.

Place around 13 of those balls on a tray, leaving them some space to flatten
out, and cook in an oven at 175'C (or about 350 freedom units) for about 15
minutes. Once the breads start to have brown spots, they're done. Move into a
basket to cool down for a bit.

Now, that's just one tray - there's enough dough for about five trayfuls. So
while the first set is in the oven, roll those balls and freeze them in sets of
around 13. I've found that amount fits nicely on a plate, but again, your plates
are probably different than mine.

When freezing, try to avoid freezing them into one huge clump, as they are
really annoying to separate. Not impossble, but annoying. I've tried a few
different methods, like freezing them on a plate for a while and then bagging
them, or bagging them and putting the bags flat in a freezer. Your mileage may
vary and all that.

I've found the two-bags-of-starch amount to be fine, there's enough in the
freezer for later or when you're having guests, it's not too massive amount to
make at once (everything fits in one large bowl, etc). Maybe halve the recipe if
you plan to cook everything at once, when there's a family gathering or
something.

Like most things, chipas are best eaten fresh. Just let them cool down a bit so
you don't burn yourself.

Anyhoo, enjoy.


SOLOUD ON SPECNEXT


JULY 21ST, 2024 (PERMALINK)

I pushed a new update to the SoLoud repository a couple days ago, after years of
absence. What I uploaded was a SoLoud console, with 8000+ lines of generated
code. What it means that, if you have C code like..

SoLoud::Soloud soloud;
SoLoud::Wav sample;
soloud.init();
sample.load("pew_pew.wav");
soloud.play(sample);


..then, you can achieve the same through the console by:

SoLoud console 202002
Type "help" for help, "quit" to quit
♫> s soloud create
♫> w wav create
♫> 0 soloud init s
♫> 0 wav load w "pew_pew.wav"
♫> 0 soloud play s w


The console commands are parsed and sent through the 'c' api. The commands
follow the format of destination variable, object, function, and zero to however
many parameters are required.

Since it follows the 'c' api, the first parameter is typically a created object.

The console is super easy to crash. Just use a wrong handle as the object, for
example. Everything is casted through a void pointer.

So what's the point? Well... the Spectrum Next has a Raspberry Pi Zero on it,
which is not used for much. Early on I had the idea to just drop SoLoud in
there, but it didn't feel right. I mean, when you have this retro-plus 8 bit
machine, you don't expect it to play several mp3 streams through a reverb
filter...

I've been requested to try it out nevertheless, so the first step was to ponder
what kind of program it would be, and the console makes most sense.

Next up is the hurdle to compile it to the nextpi. As it happens, I went through
a lot of that last year so I have most of the pieces.

What I didn't mention was the compile command line(s). Since it's been a while
that would have been annoying to re-research.



I rebuilt the frankensteinian setup I used last time - Raspberry Pi Zero
connected to an USB hub with a USB ethernet adapter which is connected to the
laptop, raspi is also taking power from the laptop USB; raspi's mini-hdmi goes
to a monitor and an USB keyboard is also connected to the hub so I can log in to
the NextPi so it can tell me the IP address I can ssh to from the laptop. (After
I know the IP I can take out about half of this config).

And looking at command history, I have this:

g++ nextgpio.cpp RtMidi.cpp nextpimidi.cpp -Os -lpthread -D__LINUX_ALSA__ -lasound -s


The console won't need GPIO. In fact, I want to leave the GPIO alone so audio
output works. I also won't need RtMidi, for that matter, but I will need ALSA.
Uh, which means I'll also need to plug in some USB audio device so I can test if
this works at all without having to send the binary to the Next.

To prep, I gathered all the sources and headers I needed in a single directory
(the ALSA sink, all audio sources, all headers, and the console sources). I
scp'd these to the pi, and compiled:

g++ *.cpp *.c -Os -lpthread -D__LINUX_ALSA__ -lasound -s -DWITH_ALSA


The __LINUX_ALSA__ bit is probably just for RtMidi, but it doesn't hurt to have
it there.

Executing this took a very long time. And failed due to some wrong include
paths, which is not surprising given that I had flattened everything to a single
directory. I had to edit a bunch of files to remove relative paths, after which
it... failed when linking. I stubbed the openmpt calls (it's not like I was
going to compile openmpt anyway) and to my surprise it built. To a 607204 byte
binary. Which is rather huge, but then, there's a lot of stuff in there.

It also ran, but since I had not bothered to plug in an audio device I couldn't
say if it plays or not at the time.

I then scp'd the binary out of the raspi, copied it over to my other PC on an
usb stick (they're on different networks... don't ask), nextsynced the binary to
the next, used .pisend to copy the binary over to the pi.

Next I hit .term and the following sequence:

SUP> chmod 777 nextpi-soloud
SUP> ./nextpi-soloud
Soloud console SOLOUD_VERSION
type "help" for help, "quit" to quit
> s soloud create
> 0 soloud init s
> p speech create
> p speech settext p "hello from spec next"
> 0 soloud play s p



SOLOUD-NEXTPI.OGG

(audio-tag not supported by your browser)

Audio through nextpi

Download

Don't mind the noise floor.. I probably have a ground loop or two. Anyway, I did
try a couple different audio sources and it seems to be working fine.

The nextpi-soloud binary I used can be downloaded here. For more info about
SoLoud, point your browser this way, with the sources to it here on github.

I haven't stressed SoLoud on the zero, so I don't know how many mp3 files you
can decode at the same time, but consider this: we're talking about decoding
several mp3 files at the same time. On a retro platform. You now have great
power, so handle it with great responsibility.


MMXXIV


JULY 21ST, 2024 (PERMALINK)

I think this must be a record for my late start of blogging in a year.

Let's start with the new year demo, released almost 8 months ago already..

What can I say.. the start of the year was pretty stressful, largely for reasons
I'm not allowed to talk about. Since then, I've bicycled around 1000 km, and
found that doing physical things helps with stress. It's just generally super
boring. And you don't even lose weight. You just get hungrier. Cycling is not as
boring, though, and I've learned a lot about my local surroundings as I've
criss-crossed all sorts of paths.

One thing I haven't apparently mentioned in this blog (but you can see the links
around), I set up a Ko-Fi shop. As a finn it's illegal for me to ask for
donations (which also rules out stuff like kickstarter), but nothing stops me
from selling services. At a quick glance what I'm offering may seem like a joke,
but they're all serious offers, and in the past I've had (mostly) happy
customers for every single item I'm listing.

The prices I'm listing are really low-balling the actual value. I'll adjust the
prices if there's too much interest.

One update from a post from last year:



So I modded my 3d printer a bit. Only a bit. The Ikea Lack-table enclosure is
the obvious bit, with LED strip lighting, concrete slab to reduce vibrations,
two filament dryer/feeders on top, raspberry pi with OctoPrint somewhere below
along with two buckets, one for PLA and other for PETG waste. Less obvious are a
few smaller prints that do cable management and other tidyings-up.

I ran the printer basically nonstop for a couple of months, but now I only print
when I have a need for something. Most of the early prints were for playing with
the printer and/or modding it. The enclosure clearly lifts the temperature over
ambient which may help with the print stability, but in all honestly the primary
reason for it is to look nice.

As for look ahead.. I have a few ideas about what I want to blog about (that
don't fit in a toot), and I have one rather experimental project for the ZX
Spectrum Next cooking, so unless something happens, you should find a few more
blog posts here this year.

Next year
 * 24
 * 23
 * 22
 * 21
 * 20
 * 19
 * 18
 * 17
 * 16
 * 15
 * 14
 * 13
 * 12
 * 11
 * 10
 * 09
 * 08
 * 07
 * 06
 * 05
 * older

Previous year

Site design & Copyright © 2024 Jari Komppa

Possibly modified around: 27 July 2024

(1,0) (1,3) (-2,-1) (3,-1) (3,-3) (-2,-3)