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 through nextpi

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.