Skip to content

Instantly share code, notes, and snippets.

@joe-warren
Last active May 4, 2026 15:52
Show Gist options
  • Select an option

  • Save joe-warren/151b220f8dd8fd1c4754a287a24f04d9 to your computer and use it in GitHub Desktop.

Select an option

Save joe-warren/151b220f8dd8fd1c4754a287a24f04d9 to your computer and use it in GitHub Desktop.
Desk Mounted Audio Adaptor

Desk Audio Adaptor

Designed to have an f-f audio adaptor wired into it, then be screwed onto the side of a desk

import qualified Waterfall
import Linear
import Control.Lens
import Data.Function ((&))
w :: Double
w = 30
innerL :: Double
innerL = 50
outerL = (innerL + wallT * 2)
wallT = 1.6
portHeight :: Double
portHeight = -16
deskT = 18
deskHookT = 4
deskHookL = 20
rearTabL = 20
holeR = 6/2
holeBR = 8.5/2
doodad :: Waterfall.Solid
doodad =
let outerBaseCube = Waterfall.unitCube
& Waterfall.translate (negate $ unit _z)
& Waterfall.translate (negate 0.5 *^ unit _x)
& Waterfall.scale (V3 w outerL (abs portHeight) )
outerBaseCyl = Waterfall.unitCylinder
& Waterfall.scale (V3 (w/2) (w/2) outerL)
& Waterfall.rotate (unit _x) (-pi/2)
& Waterfall.translate (portHeight *^ unit _z)
upperBaseCube = Waterfall.unitCube
& Waterfall.translate (negate 0.5 *^ unit _x)
& Waterfall.scale (V3 w deskHookL (deskT + deskHookT))
upperBaseCubeGap = Waterfall.unitCube
& Waterfall.translate (negate 0.5 *^ unit _x)
& Waterfall.scale (V3 (2*w) deskHookL deskT)
& Waterfall.translate (deskHookT *^ unit _y)
rearTab = Waterfall.unitCube
& Waterfall.translate (negate $ unit _z)
& Waterfall.translate (negate 0.5 *^ unit _x)
& Waterfall.scale (V3 w (outerL + rearTabL) (deskHookT))
-- & Waterfall.translate (0.5 *^ unit _y)
innerBaseCube = Waterfall.unitCube
& Waterfall.translate (negate $ unit _z)
& Waterfall.translate (negate 0.5 *^ unit _x)
& Waterfall.scale (V3 (w - 2*wallT) (outerL- 2*wallT) (abs portHeight) )
& Waterfall.translate (wallT *^ unit _y)
innerBaseCyl = Waterfall.unitCylinder
& Waterfall.scale (V3 (w/2 - wallT) (w/2 - wallT) (outerL - 2*wallT))
& Waterfall.rotate (unit _x) (-pi/2)
& Waterfall.translate (portHeight *^ unit _z + wallT *^ unit _y)
jackHoleA = Waterfall.centeredCylinder
& Waterfall.scale (V3 holeR holeR (outerL * 3))
& Waterfall.rotate (unit _x) (-pi/2)
& Waterfall.translate (portHeight *^ unit _z)
jackHoleB = Waterfall.unitCylinder
& Waterfall.scale (V3 holeBR holeBR (outerL * 3))
& Waterfall.rotate (unit _x) (pi/2)
& Waterfall.translate (portHeight *^ unit _z)
& Waterfall.translate (10 *^ unit _y)
screwR = 1.5
screwHole = Waterfall.centeredCylinder
& Waterfall.scale (V3 screwR screwR 100)
& (<> (Waterfall.unitCone & Waterfall.uScale 100 & Waterfall.rotate (unit _x) pi))
& (`Waterfall.intersection` (Waterfall.centeredCylinder & Waterfall.scale (V3 10 10 100)))
& Waterfall.translate ((outerL + rearTabL/2) *^ unit _y)
positives = (outerBaseCube <> outerBaseCyl <> upperBaseCube <> rearTab)
& Waterfall.roundConditionalFillet filletF
filletF (s, e)
| nearZero (s ^. _y) && nearZero (e ^. _y) = Just 1.4
| (s ^. _z > 0) && (e ^. _z > 0) = Just 1.4
| otherwise = Nothing
negatives =
upperBaseCubeGap <> innerBaseCube <> innerBaseCyl <> jackHoleA <> jackHoleB <> screwHole
in positives `Waterfall.difference` negatives
main :: IO ()
main = Waterfall.writeSTL 0.01 "audio-desk-big-f.stl" doodad
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
import qualified Waterfall
import Linear
import Control.Lens
import Data.Function ((&))
w :: Double
w = 20
innerL :: Double
innerL = 35
outerL = (innerL + wallT * 2)
wallT = 1.6
portHeight :: Double
portHeight = -10
deskT = 18
deskHookT = 4
deskHookL = 20
rearTabL = 20
holeR = 6/2
doodad :: Waterfall.Solid
doodad =
let outerBaseCube = Waterfall.unitCube
& Waterfall.translate (negate $ unit _z)
& Waterfall.translate (negate 0.5 *^ unit _x)
& Waterfall.scale (V3 w outerL (abs portHeight) )
outerBaseCyl = Waterfall.unitCylinder
& Waterfall.scale (V3 (w/2) (w/2) outerL)
& Waterfall.rotate (unit _x) (-pi/2)
& Waterfall.translate (portHeight *^ unit _z)
upperBaseCube = Waterfall.unitCube
& Waterfall.translate (negate 0.5 *^ unit _x)
& Waterfall.scale (V3 w deskHookL (deskT + deskHookT))
upperBaseCubeGap = Waterfall.unitCube
& Waterfall.translate (negate 0.5 *^ unit _x)
& Waterfall.scale (V3 (2*w) deskHookL deskT)
& Waterfall.translate (deskHookT *^ unit _y)
rearTab = Waterfall.unitCube
& Waterfall.translate (negate $ unit _z)
& Waterfall.translate (negate 0.5 *^ unit _x)
& Waterfall.scale (V3 w (outerL + rearTabL) (deskHookT))
innerBaseCube = Waterfall.unitCube
& Waterfall.translate (negate $ unit _z)
& Waterfall.translate (negate 0.5 *^ unit _x)
& Waterfall.scale (V3 (w - 2*wallT) (outerL- 2*wallT) (abs portHeight) )
& Waterfall.translate (wallT *^ unit _y)
innerBaseCyl = Waterfall.unitCylinder
& Waterfall.scale (V3 (w/2 - wallT) (w/2 - wallT) (outerL - 2*wallT))
& Waterfall.rotate (unit _x) (-pi/2)
& Waterfall.translate (portHeight *^ unit _z + wallT *^ unit _y)
jackHoles = Waterfall.centeredCylinder
& Waterfall.scale (V3 holeR holeR (outerL * 3))
& Waterfall.rotate (unit _x) (-pi/2)
& Waterfall.translate (portHeight *^ unit _z)
screwR = 1.5
screwHole = Waterfall.centeredCylinder
& Waterfall.scale (V3 screwR screwR 100)
& (<> (Waterfall.unitCone & Waterfall.uScale 100 & Waterfall.rotate (unit _x) pi))
& (`Waterfall.intersection` (Waterfall.centeredCylinder & Waterfall.scale (V3 10 10 100)))
& Waterfall.translate ((outerL + rearTabL/2) *^ unit _y)
positives = (outerBaseCube <> outerBaseCyl <> upperBaseCube <> rearTab)
& Waterfall.roundConditionalFillet filletF
filletF (s, e)
| nearZero (s ^. _y) && nearZero (e ^. _y) = Just 1.4
| (s ^. _z > 0) && (e ^. _z > 0) = Just 1.4
| otherwise = Nothing
negatives =
upperBaseCubeGap <> innerBaseCube <> innerBaseCyl <> jackHoles <> screwHole
in positives `Waterfall.difference` negatives
main :: IO ()
main = Waterfall.writeSTL 0.01 "audio-desk-f-f.stl" doodad
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View raw

(Sorry about that, but we can’t show files that are this big right now.)

Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment