Category: goatee-stroking musing, or something

  • New font: NearlyQ

    A rendering of a 9-pin “Near Letter Quality” dot matrix font. Derived from the character ROM of an Amstrad DMP3160 printer.

    image of text: Hey, do you like dot matrix printers? You do? Well, I have quite the treat for you: NearlyQ, the “Near Letter Quality” 9pin printer simulating font! Derived directly from the character ROM from an Amstrad DMP3160 printer, it has *all* of the characters: [character table removed] There’s also NearlyQMono for the fixed-width text in your life. Both fonts come with »»»BOLD««« variants, too! Much ? to the CPCWiki contributors for the ROM dumps (C) 2026, Stewart Russell – scruss.com - OFL
    somebody, somewhere, is probably still producing invoices like this

    I started work on this in 2017, revisited it in late 2018, forgot about it for a few years and then finally completed it in a couple of days in July 2026. My focus is second-to-none!

    (github mirror: scruss/NearlyQ: A rendering of a 9-pin “Near Letter Quality” dot matrix font. Derived from the character ROM of an Amstrad DMP3160 printer.)

    Coverage

    ASCII, plus many European characters. Please see the sample above.

    Proportional and mono-spaced versions are provided, each with a bold variant.

    • The DMP3160 ROM includes italics, but the coverage is not quite the same and they don’t look great. So I didn’t convert them.
    • I clearly added some extra characters to the bitmaps at some point, as the DMP3160 pre-dates the € sign, and yet, there it is!
    • The character spacings may not be the same as you’d get on a DMP3160. While the ROM does contain proportional character widths, they seem very wide. Values based on the actual widths of the bitmaps were used.
    • 9-pin printers in text mode couldn’t kern, so neither does this.
    • The bold (technically, double-strike) mode used here would be impossible for a DMP3160 to reproduce. You should care less about this than I do. (I don’t, at all.)

    Design Size

    Nominally 12 point / 6 lines per inch.

    Source

    While this font is produced entirely by one Python FontForge script per variant, the code is too ugly for you to look at. The included NearlyQ.json is likely more useful: it contains all of the pin definitions keyed by character name.

    Licence

    © 2026 – Stewart Russell, scruss.com with Reserved Font Names NearlyQ and NearlyQMono

    This Font Software is licensed under the SIL Open Font Licence, Version 1.1. https://openfontlicense.org/

    [I do not agree with SIL’s missionary work in any way, and the use of this licence isn’t an endorsement of SIL.]

    Acknowledgements / References

    Huge thanks to CPCWiki contributors who provided ROM dumps and notes on where to find character tables in the ROMs.

  • New font: OCRmA

    A rendering of a 9-pin dot matrix font intended for OCR use, specified in FIPS PUB 129 / ANSI X3.111-1986 “Optical Character Recognition (OCR) — Matrix Character Sets for OCR-MA

    Fixed width dot matrix font sample
    a lovely font if you don’t need lower case or punctuation

    (github mirror: scruss/OCRmA: 9-pin dot matrix font based on FIPS PUB 129 / ANSI X3.111-1986)

    Coverage

    Extremely limited character set:

    1 2 3 4 5 6 7 8 9 0 
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
    ⑀ ⑁ ⑂ + - . / $ < > " , ¥
    

    Lower case character glyphs are duplicates of upper case ones, although this is outside the X3.111-1986 standard.

    Design Size

    The 12 point design size is meant to reproduce 12 characters per inch horizontally, and six lines per inch vertically. OCR standards of 1986 suggested three lines per vertical inch, which can be achieved by double spacing.

    Source

    While this font is produced entirely by one Python FontForge script, the code is too ugly for you to look at. The included OCRmA.json is likely more useful: it contains all of the pin definitions keyed by character name.

    Licence

    © 2026 – Stewart Russell, scruss.com with Reserved Font Name OCRmA

    This Font Software is licensed under the SIL Open Font Licence, Version 1.1. https://openfontlicense.org/

    [I do not agree with SIL’s missionary work in any way, and the use of this licence isn’t an endorsement of SIL.]

    References

  • Look Mum, No Socket!

    My NanoLeaf NanoLight LED bulb from 2013 finally gave up the ghost: or did it …?

    A hand holds an oddly-shaped light-bulb. It is a regular dodecahedron (12 sides) but with five of the lower faces extended into kite shapes. The top six faces are regular oentagons. There are three white LEDs on 11 of the sides. All but one of the LEDs are glowing, despite the Edison Screw mount not being inserted into an outlet
    woo! spooky glowing undead lightbulb!

    The LEDs glowed for several minutes after removing it from the socket. I suspect capacitance is afoot.

    Although it was absurdly expensive ($45 [USD?]; that’s about $62 with inflation) when I got it from the original Kickstarter campaign in 2013, it has been run for several hours a day since then. I always liked the shape of the bulb, with its origami-like folds.

    Modern LED bulbs are much cheaper, but this one looks classy. The magic smoke has well and truly gone, and all that’s left is a faint glow and the stench of rancid phenolic.

  • New font: nic7pin

    A rendering of a 7-pin dot matrix font, as used by the Epson MX-70 reduced-cost printer from the mid-1980s.

    Fixed width dot matrix font sample
    note the complete lack of descenders

    (github mirror: scruss/nic7pin: a 7-pin dot matrix font, as used by the Epson MX-70)

    Name

    Seiko Epson Corporation is named as “son of EP-101”, for the world’s first compact, lightweight digital printer. I’m Scottish, and in Scots Gaelic “son of” is mac. Unfortunately, that prefix has been co-opted by an overpriced computer vendor. In Gaelic, nic means “daughter of”, so as an oblique compliment to Epson, this font is named daughter of 7 pin. It seemed like a good idea at the time …

    Coverage

    ASCII.

    Design Size

    The 12 point design size is meant to reproduce 12 characters per inch horizontally, and six lines per inch vertically.

    Source

    While this font is produced entirely by one Python FontForge script, the code is too ugly for you to look at. The included mx70.json is likely more useful: it contains all of the pin definitions keyed by character name.

    Licence

    © 2026 – Stewart Russell, scruss.com with Reserved Font Name nic7pin

    This Font Software is licensed under the SIL Open Font Licence, Version 1.1. https://openfontlicense.org/

    [I do not agree with SIL’s missionary work in any way, and the use of this licence isn’t an endorsement of SIL.]

    References

  • New font: A73

    Based on E73 from a couple of days ago, this is extended for full ASCII coverage:

    Fixed width dot matrix font sample

    Design Size

    The 12 point design size is meant to reproduce 10 characters per inch horizontally, and six lines per inch vertically.

    Variants

    The ECMA 42 standard states (§ 4.2):

    The dots … are circles of 0.4 mm diameter nominal or polygons of equivalent area.

    So I went slightly overboard on the dot shapes:

       A73      Circles
       A73D     Diamonds
       A73L     Lozenges
       A73P     Pentagons
       A73S     Squares
       A73T     Triangles
       A73St    Stars
       A73H     Hearts(!)
    
    font sample of a dot-matrix font where each character is made up of dots that are circles, diamonds, lozenges, pentagons, squares, triangles, stars or hearts

    Source

    While this font is produced entirely by one Python FontForge script, the code is too ugly to include here. The included a73.json is likely more useful: it contains all of the pin definitions keyed by character name.

    Licence

    © 2026 – Stewart Russell, scruss.com with Reserved Font Names A73, A73D, A73L, A73P, A73S, A73T, A73St and A73H.

    This Font Software is licensed under the SIL Open Font Licence, Version 1.1.
    https://openfontlicense.org/

    [I do not agree with SIL’s missionary work in any way, and the use of this licence is in no way an endorsement of SIL.]

    Reference

  • New font: E73

    Hey! If you want a variant with full ASCII coverage, go here: A73.

    A rendering of the ECMA-42 standard bitmap printer font from 1973.

    Fixed width dot matrix font sample
    No descenders, and no two adjacent dots are filled, like all old 7-pin printers

    Also on github: scruss/E73: ECMA-42 standard printer font from 1973.

    Name

    E from ECMA, and 1973 for its publication year.

    Coverage

    ASCII, mostly. The standard did not provide definitions for these characters:

    • U+005F _ LOW LINE
    • U+0060 ` GRAVE ACCENT
    • U+007B { LEFT CURLY BRACKET
    • U+007D } RIGHT CURLY BRACKET
    • U+007E ~ TILDE

    As this is an attempt to faithfully implement a standard, these characters were not synthesized. In a slight concession to modernity, glyphs for A–Z have been copied to a–z.

    The standard also defines the following extended characters:

    • U+00A4 ¤ CURRENCY SIGN
    • U+00A3 £ POUND SIGN
    • U+00C6 Æ LATIN CAPITAL LETTER AE
    • U+00C5 Å LATIN CAPITAL LETTER A WITH RING ABOVE
    • U+00C4 Ä LATIN CAPITAL LETTER A WITH DIAERESIS
    • U+00A7 § SECTION SIGN
    • U+0132 IJ LATIN CAPITAL LIGATURE IJ
    • U+00D6 Ö LATIN CAPITAL LETTER O WITH DIAERESIS
    • U+00D8 Ø LATIN CAPITAL LETTER O WITH STROKE
    • U+00DC Ü LATIN CAPITAL LETTER U WITH DIAERESIS

    Design Size

    The 12 point design size is meant to reproduce 10 characters per inch horizontally, and six lines per inch vertically. This is a requirement of the standard to match OCR fonts of the day.

    Variants

    None. This is an attempt to reproduce the character forms exactly according to the standard document.

    Source

    While this font is produced entirely by one Python FontForge script, the code is too ugly to include here. The included ecma42.json is likely more useful: it contains all of the pin definitions keyed by character name.

    Licence

    © 2026 – Stewart Russell, scruss.com with Reserved Font Name E73

    This Font Software is licensed under the SIL Open Font Licence, Version 1.1.
    https://openfontlicense.org/

    [I do not agree with SIL’s missionary work in any way, and the use of this licence is in no way an endorsement of SIL.]

    Reference

  • Twenty Past May

    `project.license` as a TOML table is deprecated!!
    `project.license` as a TOML table is deprecated!!
    `project.license` as a TOML table is deprecated!!

    Do not make me care about your problems, little computer.
    - Something used to work;
    - I upgraded;
    - Now it doesn't.

    you need to update your project
    and remove deprecated calls
    or your builds
    will no longer be supported.

    This is not my project, little computer.
    It's something I use for enjoyment, to make my day better.
    But you make your problems my problems,
    and the world becomes an unkinder place.

    ERROR: Failed to build 'Pillow'
    when getting requirements
    to build wheel

    Are you tired, little computer?
    Your antics certainly wear me out.
    You can't build a wheel with a pillow:
    even I know that.

  • Official SCRABBLE®Brand ANAGRAMS

    game box with red top saying Official Scrabble® Brand ANAGRAMS with the last word picked out in pictures of rectangular wooden game tiles
    that red is much more orange in daylight. Note 1964 copyright year …

    Found in a thrift store, the 1960s Selchow & Righter SCRABBLE® variant that nobody loved. It has no board, but 180 tiles, slightly different from the SCRABBLE® ones (dang, I love that I can type ®, can’t you tell?)

    26 wooden letter tiles from SCRABBLE® Anagrams, arranged in alphabetical order
    that Q, tho …

    The stencilling/printing isn’t perfectly even in position, but I do have to remember these are at least 60 years old:

    six wooden letter E tiles from SCRABBLE® Anagrams
    some variation in same letter placement

    The instructions from inside the box (which were murder to scan btw: appreciate me!) are dated 1962, unlike the box. There’s a PDF linked under this image for those who enjoy legibility:

    Scrabble® Anagrams instructions - the full text is later in the article

    Included in the box, possibly original, is an instruction sheet typed in the naffest font known to man:

    Scrabble® Anagrams instructions, typed in two columns in a weird cursive-like typewriter font.
    say you were typed on an early 1960s Smith-Corona Galaxie without saying, etc. …

    Should you have no taste at all and want this excuse for type in your own documents, go here: zai Smith-Corona Galaxie Typewriter Font. May your documents smell of stale cigarette smoke forever. At least no-one will be able to OCR them.

    The typed rules seem to disagree with the box rules a little. Pick the one you dislike less.

    The 180 tiles have a slightly odd distribution for English: A×14, B×4, C×4, D×8, E×22, F×4, G×6, H×4, I×18, J×2, K×2, L×8, M×4, N×10, O×14, P×4, Q×2, R×12, S×8, T×10, U×8, V×2, W×2, X×2, Y×4, Z×2. You’re not going to make this up with any number of SCRABBLE® tile sets.

    You can’t even make up a full 144 tile Bananagrams set with these. Even if you remove the excess tiles (A, B, C, D×2, E×4, F, G×2, H, I×6, L×3, M, N×2, O×3, P, R×3, S×2, T, U×2, Y), you’d still be short by a V and a W. A bug, perhaps?

    Here are the rules from the box lid in full:

    OFFICIAL SCRABBLE® BRAND ANAGRAMS

    HOW TO PLAY ANAGRAMS

    Of the many varieties of word games, Anagrams is one of the oldest and best known. The word Anagram means a word formed by rearranging the letters of a different word so as to completely change it. For example, the three letters of A, P, T can be combined to spell APT, TAP and PAT. These words are anagrams of one another. The game of Anagrams is a contest in forming words by combining letters drawn at random or by rearranging letters of words already formed.

    This anagram set consists of 180 letters assorted in proportion to their frequency of use in forming words in the English language as computed by experts in analysis of word formations.

    To Start:

    Place all letters face down on a table. Shuffle them and arrange in approximately equal groups at the corners or sides of the table. (Or place them in a box or bowl from which they can be drawn conveniently one-by-one without being seen in advance.) Leave room in the center of the table for a dozen or more letters and clear a space in front of each player for the words that he will form.

    Each player (2 to 6 make the best game) then draws one letter and places it face up in the center of the table. The player drawing the letter nearest the beginning of the alphabet wins first turn. Others follow him clockwise around the table. (In case of a tie for first turn, the tied players draw again until the tie is broken.)

    If fewer than 10 letters have been turned up in the center of the table the player who has won first turn draws enough additional letters to make a total of 10 exposed letters on the table. For the remainder of the game the stock of exposed letters in the center of the table is replenished only by discards.

    Word Formation:

    The person who is taking his turn begins by drawing one concealed letter from any place on the table. This is his key letter. He tries to play it in one of the following three ways:

    1. He may combine his key letter with 3 or more of the exposed letters from the center of the table to form a word of 4 or more letters. (For beginners use 3 or more letters.) If he can do so he places the word on the table in front of him and facing the center so that it is legible to all other players. (Note: He may not use letters from the center of the table to form a word which does not include his key letter.)
    2. He may add his key letter (and one or more letters from the center of the table if possible) to enlarge or change one of his own words. For example, if his key letter is S and one of his own words is CARE, he may play the key letter to form CARES, RACES or SCARE; or he might play it and a T from the center of the table to form CARETS, CASTER, CRATES or TRACES.
    3. He may steal a word previously formed by another player by adding his key letter (with one or more letters from the center of the table if possible) to form a new word in which the letters of the stolen word are rearranged. In the example used above he might steal the word CARE from another player by changing it to RACES, CASTER, CRATES or TRACES; he could not steal it to form CARES, CARETS or SCARE because the letters of the original word have not been rearranged.

    Each player continues to draw and play key letters as long as he can use them in one of these three ways. If he draws a key letter that can not be played he discards it face up in the center of the table and his turn ends. The next player to the left then draws and begins his turn.

    Challenging:

    Before the game begins the players must agree on the types of words that will be used. Common practice is to use only words found in the alphabetical section of a standard dictionary excluding abbreviations, prefixes, suffixes, capitalized words and those requiring hyphens or apostrophes. These or other classes of words (such as geographical names) may be included by agreement. The important thing is to have a clear understanding before the game begins.

    When a word is formed, changed or stolen during the game any other player or players may challenge it for spelling or other requirements that have been agreed upon. The word then must be found in the dictionary and verified. If it is correct the player retains the word and continues his turn; any player who has challenged a correct word loses his next turn. If the word can not be verified the letters are returned to the center of the board, to the original word or to the player from whom they were stolen, as the case may be; the person who attempted to form the word ends his turn at once and discards his key letter even though there might be other ways in which he could have used it.

    A word may be challenged only at the time that it is played.

    Penalty:

    If a player, when drawing his key letter or at any other time after the play begins, exposes any concealed letter other than the key letter to which he is entitled, all letters so exposed are placed face up in the center of the table and the player loses the remainder of his turn or his next turn, as the case may be.

    Scoring:

    The game ends when one player has accumulated ten words or when the last concealed letter has been drawn, whichever occurs first. Scores then are counted by crediting each player with one point for each four-letter word and one additional point for each letter over four in any word.

    COPYRIGHT 1962 BY SELCHOW & RIGHTER COMPANY, BAY SHORE, NEW YORK

    Makers of PARCHEESI®, A Backgammon Game of India

    Made in U.S.A.

    The game is listed as Scrabble Scoring Anagrams on Board Game Geek and given a much later date (1972) than this one.

  • Crosstown is finally open and I am 😐

    It’s years late and many millions over budget, but — at last — the TTC Line 5 Eglinton Crosstown is open today! I am slightly happy for them, as finally they’ll have to stop making excuses about why it’s closed.

    I rode a little bit of it today (it was free) and this little bit of dust graffiti sums up how I feel

    dust inscription on Kennedy station's window says: it's finally open! ?
    dust inscription on Kennedy station’s window says: it’s finally open! 😐

    I rode the surface section from Kennedy to Aga Khan Park this afternoon, and my overall impression was: wow, this is really slow.

    Map of Eglinton Avenue East, showing Crosstown stations from Aga Khan Park & Museum to Ionview
    Map of Eglinton Avenue East, showing Crosstown stations from Aga Khan Park & Museum to Ionview

    I was only able to track the train from Ionview, as my phone GPS is useless underground.

    Westbound

    I got on a westbound train a little after 15:30

    Station Distance / km Arrive Depart Time Speed / km/h
    Ionview 15:37:20
    Birchmount 0.552 15:39:05 15:39:40 1′ 45″ 18.9
    Golden Mile 1.244 15:42:37 15:42:39 2′ 57″ 25.3
    Hakimi Lebovic 0.455 15:44:29 15:44:30 1′ 50″ 14.9
    Pharmacy 0.592 15:47:55 15:48:30 3′ 25″ 10.4
    O’Connor 0.584 15:50:00 15:51:55 1′ 30″ 23.3
    Sloane 1.225 15:53:25 15:54:03 1′ 30″ 49.0
    Wynford 1.600 15:56:45 15:57:17 2′ 42″ 35.5
    Aga Khan Park & Museum 0.718 15:58:25 1′ 08″ 38.0
    Total 6.969 21′ 05″ 19.8

    Despite getting up to almost 50 km/h between O’Connor and Sloane, we still didn’t exceed an average of 20 km/h over the whole 7 km trip. So many stops for lights. Traffic on Eglinton was moving faster than us.

    Eastbound

    Two Alstom TTC/Metrolinx Crosstown light rail trains sit at the rather snowy Aga Khan Park station
    Two Alstom TTC/Metrolinx Crosstown light rail trains sit at the rather snowy Aga Khan Park station

    I had to wait for 10 minutes at Aga Khan Park station for the return train. It was just a little brisk out. When it finally arrived, it was so busy that I ended up smushed against a door for most of the ride.

    Station Distance / km Arrive Depart Time Speed / km/h
    Aga Khan Park & Museum 16:08:55
    Wynford 0.718 16:10:10 16:11:00 1′ 15″ 34.4
    Sloane 1.600 16:14:00 16:14:45 3′ 00″ 32.0
    O’Connor 1.225 16:17:35 16:19:15 2′ 50″ 25.9
    Pharmacy 0.584 16:20:35 16:21:15 1′ 20″ 26.3
    Hakimi Lebovic 0.592 16:23:10 16:23:30 1′ 55″ 18.5
    Golden Mile 0.455 16:25:52 16:25:54 2′ 22″ 11.5
    Birchmount 1.244 16:29:50 16:30:25 3′ 56″ 19.0
    Ionview 0.552 16:31:35 1′ 10″ 28.4
    Total 6.969 22′ 40″ 18.4

    Even slower coming back.

    It’s okay, TTC/Metrolinx: we’ve got used to waiting.

  • The Epic of Mitorzp (fragment)

    A lined index card with lines of cut up teletype paper tape stuck to it. The tapes read: HE F=RIDZT GOT T BAZU N LH EENGER COULDDARA= LSEEWTARM. = LISON =ASWHJDOO ZAS ZETH MI=TI ZEAC OS B=PN LLHERE T-R=RS =WE=Z=PNS=E M HIZI VALD R G M M ANT =ART=H MITORZP PBTHAT L EEUEB XTAZ=ECL EELING F OMB= ICKSAWN=LTO HIS ENZ= The words MITORZP and ICKSAWN are highlighted, the first in pink and the second in yellow.
    teleprinter tape glued to index card, 15 × 10 cm, paper/card/highlighter pencils (2025)

    This is the only surviving fragment of The Epic of Mitorzp. It was transmitted by an unknown intelligence, but discarded by human operators as mere line noise.

    HE F=RIDZT GOT
    T BAZU N LH EENGER COULDDARA=
    LSEEWTARM. = LISON =ASWHJDOO ZAS ZETH
    MI=TI ZEAC OS B=PN LLHERE T-R=RS
    =WE=Z=PNS=E M HIZI VALD R G M
    M ANT =ART=H MITORZP PBTHAT L
    EEUEB XTAZ=ECL EELING F OMB=
    ICKSAWN=LTO HIS ENZ=

    Who was Mitorzp? A hero? An outcast? We will never know. This tiny remnant can only hint at the colossal magnitude of the lost epic.

  • img2blocks

    this image is supposed to be made almost entirely of sextant blocks, the Unicode characters around U+1FB00 – U+1FB1E made out of two columns of three blocks. They’re originally from broadcast teletext, and were made to build low-resolution images on a text screen

    a blocky image of a large flightless bird with the text "Cassowary Detected"
    redrawn from an image in Artificial intelligence used to reduce cassowary road deaths in Queensland

    And here’s the original tiny image:

    a small image of a large flightless bird with the text "Cassowary Detected"
    “Cassowary Detected”, at actual size

    Making the pixel to character map is quite tricky. The Sextant character block isn’t contiguous, and it’s not in the order we need. It’s also missing four characters: empty block, full block, left half block and right half block. These have to be pulled in from other Unicode blocks.

    This is the map I came up with, from 0–63 with LSB at bottom right and MSB at top left:

     🬞🬏🬭🬇🬦🬖🬵🬃🬢🬓🬱🬋🬩🬚🬹🬁🬠🬑🬯🬉▐🬘🬷🬅🬤🬔🬳🬍🬫🬜🬻🬀🬟🬐🬮🬈🬧🬗🬶🬄🬣▌🬲🬌🬪🬛🬺🬂🬡🬒🬰🬊🬨🬙🬸🬆🬥🬕🬴🬎🬬🬝█

    After that, it’s a small matter of bashing something together in Python with PIL and Numpy. Here’s the source:

    or if you want to take a look first: img2blocks – bitmap to Unicode sextants

    blocky criss-crossed bars make a pseudo woven pattern
    X11’s wide_weave, scaled up

    (yes, there are clever things like Chafa that can do more, but it can’t do exactly what this does)

  • For 4 MB ESP32-S3 users

    If you have a Wemos/LOLIN S3 MINI PRO board, you might find that firmware images don’t flash so well. That’s because the ESP32-S3FH4R2 has 4 MB of flash storage, and most ESP32-S3 boards have 8 MB.

    glenn20/mp-image-tool-esp32 might be your new friend:

    mp-image-tool-esp32 -f 4M --resize vfs=2M ESP32_GENERIC_S3-20250415-v1.25.0.bin

    This trims down a standard MicroPython ESP32-S3 firmware from a 4 MB filesystem partition down to 2 MB, and sets the overall flash size to 4 MB. Upload that to your board, and all will be well.

    Alternatively, v1.26 supports “4MiB and larger” flash chips. I have confirmed that ESP32_GENERIC_S3-20250724-v1.26.0-preview.bin works as expected:

    $ mpremote a1 run boardstats.py 
    Board : Generic ESP32S3 module with ESP32S3
    Frequency : 160 MHz
    Free Memory : 2061232
    File storage: 2036 / 2048 K
  • Snow-loving Solar Marble Machine

    Martin Raynsford / Solarbotics Solar Marble Machine loving glare off deep snow

    Still going strong after more than a decade in the front window, the Solar Marble Machine has been running flat out all day because of the glare from the deep snow outside. It might normally do one click a day, if any at all.

  • Cheap NeoPixels at the Dollar Store

    Exhibit A:

    box of "Monster BASICS" Sound reactive RGB+IC Color Flow LED strip

    also known as “Monster BASICS Sound reactive RGB+IC Color Flow LED strip”. It’s $5 or so at Dollarama, and includes a USB cable for power and a remote control. It’s two metres long and includes 60 RGB LEDs. Are these really super-cheap NeoPixel clones?

    I’m going to keep the USB power so I can power it from a power bank, but otherwise convert it to a string of smart LEDs. We lose the remote control capability.

    Pull back the heatshrink at the USB end:

    led strip with shrink tubing pulled back to show the +5 V, Din and GND solder tterminals

    … and there are our connectors. We want to disconnect the blue Din (Data In) line from the built in controller, and solder new wires to Din and GND to run from a microcontroller board.

    led strip with additional wires soldered to Din and GND contacts

    Maybe not the best solder job, but there are new wires feeding through the heatshrink and soldered onto the strip.

    led strip with two additional wires soldered in and heatshrink pushed back, all held in place by a cable tie

    Here’s the heatshrink pushed back, and everything secured with a cable tie.

    Now to feed it from standard MicroPython NeoPixel code, suitably jazzed up for 60 pixels.

    a glowing multicolour reel of of LEDs

    A pretty decent result for $5!

  • Thousand Days: Concept

    reference copy: Thousand Days: Concept on github.

    Stewart Russell – scruss.com — 2024-03-26, at age 19999 days …

    Summary

    One’s thousand day(s) celebration occurs every thousand days of a person’s life. They are meant to be a recognition of getting this far, and are celebrated at the person’s own discretion.

    Who is this for?

    • Maybe your birthday’s on a day associated with an unpleasant event. Your thousand day will never coincide with your birthday.
    • Maybe your birthday’s in the middle of winter, or in another part of the year that you’re not keen on. Your thousand day is every 2 years and 3 seasons, so it shifts back by a season every time it happens.

    Quantities and scale

    1000 days is approximately:

    • 2.738 years
    • 2 years 269 days
    • 2 years 8.85 months
    • 2 years, 3 seasons.

    4000 days is just shy of 11 years.

    Disadvantages

    Compared to regular birthdays, thousand days:

    • must be calculated; they’re not intuitive when they’re going to happen. But we have computers and calendar reminders for that …
    • can be used to work out your actual date of birth, if someone knows that you’re going to be x000 days old on a particular day. It’s possible to know someone’s birthday, but not know their age.

    Implementations

    Web

    My ancient Your 1000 Day Birthday Calculator, first published in 2002 and untouched since 2010.

    Shell

    So it turns out that GNU date can handle arbitrary date maths quite well. For example:

    date --iso-8601=date --date="1996-11-09 + 10000 days"

    returns 2024-03-27.

    Other Ways

    Excel or any other spreadsheet will do, too. Although not for too many years back

    People with the same thousand day as you

    This is an idea for finding people who have a thousand day on the same day as you. I suggest using 1851-10-01 as a datum, because:

    • nothing particularly interesting happened that day;
    • it’s conveniently 43000 days before my birthday.

    then calculate

    ( (birth_date - 1851-10-01) mod 1000 ) + 1
    

    This results in a number 1 – 1000. Everyone with the same number shares a 1000 day birthday with you.

    Why not 0 – 999?

    1. No-one deserves to be a zero;
    2. Wouldn’t be much of a thousand day if it only went up to 999, would it?

    Incomplete list of people with day = 1

    There are more, but these were found from Wikipedia’s year pages

    Licence

    🅭 2024, Stewart Russell, scruss.com

    This work is licensed under CC BY-SA 4.0.

    There are no trademarks, patents, official websites, social media or official anythings attached to this concept. Please take the idea and do good with it.

    So why aren’t you implementing this further?

    I’ve had this idea kicking around my head for at least the last 20 years. For $REASONS, it turns out I’m not very good at implementing stuff. I’d far rather someone else took this idea and ran with it than let it sit undeveloped.

  • The Potato

    … is a thing to help soldering DIN connectors. I had some made at JLCPCB, and will have them for sale at World of Commodore tomorrow.

    a rectangular green circuit board with markings for various DIN connectors, and holes for the connector pins to fin through. One of the sets of holes is filled by a 7-pin 270° DIN connector, ready for soldering.

There are various pinouts for retrocomputers on the board. There is also the slogan THE POTATO, with a smiling cartoon potato next to it
    Sven Petersen’s “The Potato” – front. DIN7 connector not included
    a rectangular green circuit board with markings for various DIN connectors, and holes for the connector pins to fin through. One of the sets of holes is filled by a 7-pin 270° DIN connector, ready for soldering.

There are various pinouts for retrocomputers on the board. There is also the slogan DE KANTÜFFEL, with a smiling cartoon potato next to it
    Sven Petersen’s “The Potato” – back

    You can get the source from svenpetersen1965/DIN-connector_soldering-aid-The-Potato. I had the file Rev. 0/Gerber /gerber_The_Potato_noFrame_v0a.zip made, and it seems to fit connector pins well.

    Each Potato is made up of two PCBs, spaced apart by a nylon washer and held together by M3 nylon screws.

  • can we…?

    This is a mini celebratory post to say that I’ve fixed the database encoding problems on this blog. It looks like I will have to go through the posts manually to correct the errors still, but at least I can enter, store and display UTF-8 characters as expected.

    “? µ ° × — – ½ ¾ £ é?êè”, he said with some relief.

    Postmortem: For reasons I cannot explain or remember, the database on this blog flipped to an archaic character set: latin1, aka ISO/IEC 8859-1. A partial fix was effected by downloading the entire site’s database backup, and changing all the following references in the SQL:

    • CHARSET=latin1 → CHARSET=utf8mb4
    • COLLATE=latin1_german2_ci → COLLATE=utf8mb4_general_ci
    • COLLATE utf8mb4_general_ci → COLLATE utf8mb4_general_ci
    • latin1_general_ci → utf8mb4_general_ci
    • COLLATE latin1_german2_ci → COLLATE utf8mb4_general_ci
    • CHARACTER SET latin1 → CHARACTER SET utf8mb4

    For additional annoyance, the entire SQL dump was too big to load back into phpmyadmin, so I had to split it by table. Thank goodness for awk!

    #!/usr/bin/awk -f
    
    BEGIN {
        outfile = "nothing.sql";
    }
    
    /^# Table: / {
        # very special comment in WP backup that introduces a new table
        # last field is table_name,
        # which we use to create table_name.sql
        t = $NF
        gsub(/`/, "", t);
        outfile = t ".sql";
    }
    
    {
        print > outfile;
    }
    

    The data still appears to be confused. For example, in the post Compose yourself, Raspberry Pi!, what should appear as “That little key marked “Compose”” appears as “That little key marked “Compose””. This isn’t a straight conversion of one character set to another. It appears to have been double-encoded, and wrongly too.

    Still, at least I can now write again and have whatever new things I make turn up the way I like. Editing 20 years of blog posts awaits … zzz

  • SYN6288 TTS board from AliExpress

    After remarkable success with the SYN-6988 TTS module, then somewhat less success with the SYN-6658 and other modules, I didn’t hold out much hope for the YuTone SYN-6288, which – while boasting a load of background tunes that could play over speech – can only convert Chinese text to speech

    small blue circuit board with 6 MHz crystal oscillator, main chip, input headers at bottom and headphone jack/speaker output at top
    as bought from quason official store: SYN6288 speech synthesis module

    The wiring is similar to the SYN-6988: a serial UART connection at 9600 baud, plus a Busy (BY) line to signal when the chip is busy. The serial protocol is slightly more complicated, as the SYN-6288 requires a checksum byte at the end.

    As I’m not interested in the text-to-speech output itself, here’s a MicroPython script to play all of the sounds:

    # very crude MicroPython demo of SYN6288 TTS chip
    # scruss, 2023-07
    import machine
    import time
    
    ### setup device
    ser = machine.UART(
        0, baudrate=9600, bits=8, parity=None, stop=1
    )  # tx=Pin(0), rx=Pin(1)
    
    busyPin = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_UP)
    
    
    def sendspeak(u2, data, busy):
        # modified from https://github.com/TPYBoard/TPYBoard_lib/
        # u2 = UART(uart, baud)
        eec = 0
        buf = [0xFD, 0x00, 0, 0x01, 0x01]
        # buf = [0xFD, 0x00, 0, 0x01, 0x79]  # plays with bg music 15
        buf[2] = len(data) + 3
        buf += list(bytearray(data, "utf-8"))
        for i in range(len(buf)):
            eec ^= int(buf[i])
        buf.append(eec)
        u2.write(bytearray(buf))
        while busy.value() != True:
            # wait for busy line to go high
            time.sleep_ms(5)
        while busy.value() == True:
            # wait for it to finish
            time.sleep_ms(5)
    
    
    for s in "abcdefghijklmnopqrstuvwxy":
        playstr = "[v10][x1]sound" + s
        print(playstr)
        sendspeak(ser, playstr, busyPin)
        time.sleep(2)
    
    for s in "abcdefgh":
        playstr = "[v10][x1]msg" + s
        print(playstr)
        sendspeak(ser, playstr, busyPin)
        time.sleep(2)
    
    for s in "abcdefghijklmno":
        playstr = "[v10][x1]ring" + s
        print(playstr)
        sendspeak(ser, playstr, busyPin)
        time.sleep(2)
    

    Each sound starts and stops with a very loud click, and the sound quality is not great. I couldn’t get a good recording of the sounds (some of which of which are over a minute long) as the only way I could get reliable audio output was through tiny headphones. Any recording came out hopelessly distorted:

    I’m not too disappointed that this didn’t work well. I now know that the SYN-6988 is the good one to get. It also looks like I may never get to try the XFS5152CE speech synthesizer board: AliExpress has cancelled my shipment for no reason. It’s supposed to have some English TTS function, even if quite limited.

    Here’s the auto-translated SYN-6288 manual, if you do end up finding a use for the thing

  • SYN-6988 Speech with MicroPython

    Full repo, with module and instructions, here: scruss/micropython-SYN6988: MicroPython library for the VoiceTX SYN6988 text to speech module

    (and for those that CircuitPython is the sort of thing they like, there’s this: scruss/circuitpython-SYN6988: CircuitPython library for the YuTone VoiceTX SYN6988 text to speech module.)

    I have a bunch of other boards on order to see if the other chips (SYN6288, SYN6658, XF5152) work in the same way. I really wonder which I’ll end up receiving!

    Update (2023-07-09): Got the SYN6658. It does not support English TTS and thus is not recommended. It does have some cool sounds, though.

    Embedded Text Command Sound Table

    The github repo references Embedded text commands, but all of the sound references were too difficult to paste into a table there. So here are all of the ones that the SYN-6988 knows about:

    • Name is the string you use to play the sound, eg: [x1]sound101
    • Alias is an alternative name by which you can call some of the sounds. This is for better compatibility with the SYN6288 apparently. So [x1]sound101 is exactly the same as specifying [x1]sounda
    • Type is the sound description from the manual. Many of these are blank
    • Link is a playable link for a recording of the sound.
    NameAliasTypeLink
    sound101sounda
    sound102soundb
    sound103soundc
    sound104soundd
    sound105sounde
    sound106soundf
    sound107soundg
    sound108soundh
    sound109soundi
    sound110soundj
    sound111soundk
    sound112soundl
    sound113soundm
    sound114soundn
    sound115soundo
    sound116soundp
    sound117soundq
    sound118soundr
    sound119soundt
    sound120soundu
    sound121soundv
    sound122soundw
    sound123soundx
    sound124soundy
    sound201phone ringtone
    sound202phone ringtone
    sound203phone ringtone
    sound204phone rings
    sound205phone ringtone
    sound206doorbell
    sound207doorbell
    sound208doorbell
    sound209doorbell
    sound301alarm
    sound302alarm
    sound303alarm
    sound304alarm
    sound305alarm
    sound306alarm
    sound307alarm
    sound308alarm
    sound309alarm
    sound310alarm
    sound311alarm
    sound312alarm
    sound313alarm
    sound314alarm
    sound315alert/emergency
    sound316alert/emergency
    sound317alert/emergency
    sound318alert/emergency
    sound401credit card successful
    sound402credit card successful
    sound403credit card successful
    sound404credit card successful
    sound405credit card successful
    sound406credit card successful
    sound407credit card successful
    sound408successfully swiped the card
    SYN-6988 Sound Reference