Sep 25, 2023
I've been "building" an "instrument". Thanks to some samples from Ivan Reese.

To recreate the above you need:

  1. To install LÖVE for your platform (really just Android or iOS since we're talking multitouch in this post.)
  2. Download a special build of MiniIDE containing Ivan's samples.
  3. Paste in the following 70-line script and hit 'Run':
    g = love.graphics
    draw, line, circ, pt, color = g.draw, g.line, g.circle, g.points, g.setColor
    abs,min,max = math.abs, math.min, math.max
    audio = love.audio.newSource
    if od == nil then
        od,ou,omp,omr,okp,okr = love.draw, love.update, love.mousepressed,
    love.mousereleased, love.keypressed, love.keyreleased
    end
    W,H = g.getDimensions()
    -- visuals
    cs, N = {}, 100
    function sq(x) return x*x end
    function dist2(x1,y1, x2,y2)
      return sq(x2-x1) + sq(y2-y1)
    end
    
    -- audio
    ts = {}
    
    function love.draw() -- od()
      for _,c in pairs(cs) do
        circ(c[1],c[2])
      end
    end
    
    function circ(cx,cy)
      for x=cx-N,cx+N do
        for y=cy-N,cy+N do
          local dist = dist2(cx,cy, x,y)
          if dist < N*N then
            color(abs(x-cx)/N, abs(y-cy)/N, 0.5) --, dist/N/N)
            pt(x,y) end end end
    end
    
    function love.update(dt) ou(dt)
      local touches = love.touch.getTouches()
      for _,id in ipairs(touches) do
        if cs[id] then
        cs[id][1], cs[id][2] = love.touch.getPosition(id)
        ts[id]:setPitch(pitch(cs[id][2]))
        end
      end
    end
    
    function pitch(y)
      if y <= H/2 then
        return 2 - y*2/H  -- vary pitch from 2 to 1
      else
        return 1.5 - y/H  -- vary pitch from 1 to 0.5
      end
    end
    
    function love.keypressed(key, ...) okp(key, ...)
      escape()
    end
    
    function love.touchpressed(id, x,y, ...)
      cs[id] = {x,y}
      ts[id] = audio('ivanish/MaternalBowedGuitar.mp3', 'static')
      ts[id]:setLooping(true)
      ts[id]:play()
    end
    
    function love.touchreleased(id, ...)
      cs[id] = nil
      if ts[id] then ts[id]:stop() end
      ts[id] = nil
    end
    
    function escape()
      error('StopScript')
    end
    

One of those 70 lines contains 'ivanish', and I've been playing with that line by varying the sample. (Unfortunately there isn't a way to browse the list, so you have to look inside the love/zip file.)

permalink

* *
Sep 4, 2023
A silly app built for kids over the weekend using MiniIDE on a tablet.[1]

Currently breaks MiniIDE; there's no way to edit its code once you run it :joy: You can still use the console, though!

[1] Video not recorded on tablet.

permalink

* *
Aug 29, 2023
I just came up with a name for the versioning scheme I've been using recently:

Zettelkasten versioning

1, 2, 3, ... 14, 14a, 14b, ... 14z, 14aa, ... 14ak1, 14ak2, ...

Inspiration.

My versions are to communicate identity to users. That's it. Not value, not recency, not stability, not compatibility, not difference, not support status, just identity. Am I using the same version as you?

permalink

* *
Aug 26, 2023
It's now easier to build and run little LÖVE apps for yourself on Android

  1. Install LÖVE from the app store (see https://love2d.org)
  2. Download MiniIDE.love from https://love2d.org/forums/viewtopic.php?t=94852. I've been contributing to this app and vouch for it.

Video preview.

(MiniIDE has also been tested on iOS without limitations. But I gather LÖVE is quite tortuous to install on iOS, so you're on your own there..)

permalink

* *
Aug 22, 2023
You can now make any app end-user-programmable -- as long as it's built in LÖVE

Read more on the Malleable Systems Forum. Screenshot of a text editor showing a little LÖVE app, and a A blank screen with a single number in poor contrast -- which increments with every mouse click. Press any key and you're back in the text editor.

permalink

* *
Aug 14, 2023
"What can we do with what we have ready to hand?" -- Cristóbal Sciutto


"The Parisien corn cart affords a table and a secure storage area. It is mobile. Its metal mesh allows for ventilation, while minimizing weight. Combined with tensioned lumber, the mesh can secure a tin can. The can, with two large perforations, serves as a brazier. Its support and holster combine to form a buffer, avoiding burns. Elements can be positioned in transveral increments of an inch, as well as placed at three distinct vertical positions. Signage can be attached with ease.

"The corn cart is exemplar of post-industrial bricolage. It takes advantage of existing infrastructure (shopping cart, industrial lumber, and tin can production), distorting it to new unimagined uses. In recycling mass-produced industrial dejects, it takes advantage of economies of scales. Under conditions of duress, it is easy to acquire. It is a tactic that sustains economic life."

permalink

* *
Aug 11, 2023
Yesterday was a good day. I built a little app for someone to connect to their R server, plot a dataset based on different dimensions. Pretty trivial, but hopefully easier for them to modify than other similar apps out there.

permalink

* *
Aug 4, 2023
Finding Meaning in Christopher Alexander's "The Nature of Order"

by Stefan Lesser

This is the most insightful talk I've watched in recent memory.

Transcript

permalink

* *
Aug 1, 2023
Pulling out an old tool to read a long thread on Mastodon.

Screenshot of an app showing a tree view of a Mastodon thread.

Not pictured: keyboard shortcuts for structured navigation.

repo

permalink

* *
Jul 16, 2023
Fun puzzle:

$ echo "never worn" |sed 's/ /^M/g'
wornr

What is going on here?

permalink

* *
archive
projects
writings
videos
subscribe
Mastodon
RSS (?)
twtxt (?)
Station (?)