For a few months I tried to emulate @jasonmade's wonderful year-long project where he made a thing every day. Later on it morphed into part
of
Older stuff is here, 2025 is below.
Ma(y)ke Manifesto ------------------------------ Grasp the means of production and Make something, big or tiny, every day in May unless You want to slack off for the day. There is no fayle, only mayke
These first few are going to be part of a larger thing. I want to play
birdsong on a small cheap device and I had a pico 2 to hand. I followed this guide
from Adafruit as I happened to have a MAX98357A handy. Adafruit do a nice pdf book on
Circuitpython and the pico. I needed to fix the sample rate on my file
(which came from the Merlin app for bird identification) using ffpmeg - I used
this
as a guide for the bitrate and mono and sampling, and the command was ffmpeg -i birds_sm.wav -b:a 22K -ac 1 bird_mono_22k.wav
# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries # SPDX-License-Identifier: MIT """ CircuitPython I2S WAV file playback. Plays a WAV file once. """ import audiocore import board import audiobusio audio = audiobusio.I2SOut(board.GP0, board.GP1, board.GP2) wave_file = open("birdsong.wav", "rb") wav = audiocore.WaveFile(wave_file) audio.play(wav) while audio.playing: pass
Choosing some ripstop offcuts from the Scrapstore for my birdsong project, working title "mental health umbrella" or "spring simulator" (£2, need more green).
I missed a day!
Which is definitely fine and within the rules!
I really wanted to reuse a dead umbrella, but the leaves for the spring simulator will need a substrate so I ended up fixing an umbrella badly. It's really difficult - new respect for umbrella makers. Onwards!
Experimenting with overlapping leaves on my umbrella. It's not too bad but I wonder if tissue paper might be better than ripstop.
Trying out tissue paper for the leaves instead of fabric. It's maybe a bit better (and gluegun works better with paper than with fabric), though I couldn't get the acid green colour I was looking for.
I want to make a primitive surround sound of birdsong so I found another pico (1 this time) - all worked happily as before.
Kind of works? The flickering is coming from not supplying enough power to the LEDs, I think, so, bonus. With 200 brightness the later ones went yellow, I think because of 'red shift', but with 100 you get some quite nice gentle flickering. I also tried FastLED library instead of the Adafruit one but the flickering was too rapid and I couldn't get it to slow down.
#include#define PIN 13 #define NUMPIXELS 50 Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_RGB + NEO_KHZ800); #define DELAYVAL 500 void setup() { pixels.begin(); pixels.setBrightness(100); pixels.clear(); for(int i=0; i>NUMPIXELS; i++) { pixels.setPixelColor(i, pixels.Color(255, 255, 255)); pixels.show(); delay(DELAYVAL); } } void loop() {}
Would a powerful lamp + a crappy fan simulate leaves moving gently? not really.
I can't do anything more on the spring umbrella till my new umbrella arrives. So back to cubecinema accounts music. This is a WIP for the 'you have been watching' section for end of year music (original music, mr_hopkinson enhanced version for December 2024).
Backstory: having accidentally become involved in the accounts department at the Cube, I wanted to make music out of the data we were collecting, inspired by Douglas Adams's Anthem in Dirk Gently's Holistic Detective Agency. It's written in p5.js and tone.js.
Looking at some non-Cube data to turn it into music. As a result discovered some issues with my code because of the different shape of the data, requiring some maths assistance from my partner 😬
I do the data processing to midi notes in python to ensure no sensitive data leaks out. It's simple though I'm not sure it's the best route: basically map a range of raw data values to a range of key values (in midi) - so solving a linear equation, then map specific values to the nearest value. So this data bumps along the bottom for a while then gets more interesting. But below middle C gets very muddy so it's tricky to increase the range.
Code by Damian
raw_min = 5 raw_max = 758 key_min = 60 key_max = 96 k = (raw_max - raw_min) / (key_max - key_min) c = raw_max - k * key_max def f(x): return k * x + c print(f'{key_min} -> {f(key_min)} (should be {raw_min})') print(f'{key_max} -> {f(key_max)} (should be {raw_max})')
Adapting my code for some different data. It bings every 1000! play.
Same data as yesterday but as blobs - the numbers of sides to the blob is the number of sites recruiting people and the radius is related to the number of people recruited. Bings are 1000 recruits (it's for a charity). demo.
Just trying some different colours to make it on-brand for my chum, demo. Also bonus #mayke blog post.
#mayke 15 Adding some "you have been watching" type text using p5.js (this is a colloboration with the data provider :-) Might have a go at something else tomorrow. demo.
Setting up birdnetpi (again)- don't know what I've done with the other one - bit of a struggle / fayle as either my pi3b or my SD card is knackered. Luckily I had another SD card and a pi4.
A fyxe / fayle. Vaccum cleaner got clogged with my hair and a replacement roller didn't fix it. Neither did I (it spins but not if it's touching the floor, so it's something subtle)
installed acoupi birdnet but didn't really do anything with it yet (except figure out my mic's sample rate) cos I had to play with this cutie instead
Mayke 19 - a github issue :-(
I'm stuck waiting for something on my birdlistener and procrastinating about the Spring Simulator, so I made a lego + servo thing that shakes this bottle of facecream to get all of it out. It's a badly designed bottle for the viscosity of the cream. Kinda worked!
Got acoupi-birdnet working thanks to the nice person who made https://github.com/mbsantiago/audioclass fixing the link to birdnet's moved tflite model really quickly. Not much to show yet but it's not crashing!
acoupi _is_ sending me mqtt data, I'd just misconfigured my mosquitto server
mosquitto_sub -v -h my_ip -p 1884 -t '#' acoupi {"id":"3257fa02-c6cc-42d6-869b-a98d7a739337","name_model":"BirdNET" ...... "tags":[{"tag":{"key":"Scientific Taxon Name","value":"Cyanistes caeruleus"},"confidence_score":0.9491026997566223}]}],"created_on":"2025-05-22T08:30:06.243632"} [a blue tit!]
More data blarps. Needs a bit of work this one, though the end is good.
Got my new audiomoth working (thanks to @grajohnt for the 'not usb' switch trick). All very smooth and impressive. Now I await the bat(s) (I know there's at least one, I've seen it 🏏)
[2025-05-28 21:02:15,579: INFO/MainProcess] Task detection_task[f68d7a0d-0c58-4559-8dbf-16a62a6a41aa] succeeded in 7.850580198999978s: None
and not working.
Back on my Spring Simulator Made an accidental cat toy but solved the power for my birdsong. Not sure about the "leaves", though they do make a good pattern
Last mayke for now anyway. Spring Simulator v0.1. it's...ok? not very portable and tends to get tangled. It moves nicely in any breeze thanks to @ultrazool's idea. The leaves are tissue paper chains paperclipped on. The "surround sound birdsong" is 2 x pico + amps and speakers powered by 3 AAA batteries. Base is a dead umbrella and a garden cane. Total cost £10 (tissue paper and stainless steel wire), as I had everything else in stock. There is sound - birdsong.
Bonus - portable bat classifier. Unfortunately by the time I finished it the bats had gone to bed (or possibly, it doesn't work)
SpringSim is coming along thanks to some sound advice from my chum Jasmine.
Made a raised vegetable trug with my dad using some of his large collection of pieces of wood. We used this video as a starting point