Commit b407cc0f by PLN (Algolia)

live: latest tracks, backlog, perf + analysis tooling

Sync-up of the workspace: edits across nova/collab tracks
(quand_on_decolle, take_5_drops, punkachien, jeudrill,
sunny_side_up, plosive, wap, perfect, techno_orage, ...),
new collab/solo pieces (mains_libres, the_revolution_will_be_sampled,
bois_bumbum, do_it_right, bullet_train), backlog/CLAUDE.md
project notes, perf.sh (CPU governor helper), and the
analyze_samples / fan_check / shipowiz tools.
parent ad30f3d5
# Sound/Tidal
ParVagues' main livecoding workspace.
## Layout
- `live/` — current set material; per-collab subdirs (`raph/`, `micka/`, `cookie/`, `baba/`, `ccc/`, `nova/`, `rhadamanthe/`)
- `copycat/` — algoraoke (cover/remix) sketches
- `tools/` — perf scripts, sample analyzers (analyze_samples, shipowiz, fan_check)
- `backlog.md` — track backlog, setlists, gig prep notes
- `perf.sh` — performance-mode optimizer (CPU governor, etc.)
- `test.tidal` — scratchpad
## Sister projects
- **`../tidal-ears/`** — audio analysis + **post-prod mastering** tooling
(Python). See `../tidal-ears/MASTERING.md` for the canonical mastering
recipe; `tidal-ears master {analyze,boundaries,mix}` is the workflow.
- `../Ardour/Tidal Multi/` — single Ardour session, records all orbits as stems
- `../Prod/` — Audacity projects + rendered masters
- `../../Tools/pulsar-parvagues-hud/` — Pulsar HUD package
## Conventions
- Channel/orbit mapping documented in `live/` patterns; LCXL CC map in memory
- Stems exported from Ardour as `Montreuil26_Tidal 01.wav` style (one per orbit)
- Visuals composited in post; OBS captures clean code only
- Rhadamanthe's master-chain notes: `live/collab/rhadamanthe/layering.tidal`
## See also
`../tidal-ears/CLAUDE.md` for the analysis/post-prod tooling docs.
......@@ -41,13 +41,6 @@ soir noir
-- August
-- Vendredi saint & Samedi
# Recipe
# To make a ParVagues live
......@@ -71,19 +64,18 @@ Instructions
4. PROFIT
# Work in progress⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
## 26 lettres de noblesses
## Mai fait ce qu'il te plait
-- Do it Right
-- Bois BUMBUM
## Avril la musique tient a un fil
-- Sweet Revolution
## Mars Eclosion
--La Cle des champs
-- Bazurto
--La Cle des champs
Drums Architecte
## Fevrier Vide
## Janvier A
......@@ -1527,6 +1519,8 @@ url: "/home/pln/Work/Art/GLITCHWAVE/outputs/glitch_ocean_compressed.gif"
# SETLIST
# GZ AlgoRave 2025
......@@ -1798,7 +1792,7 @@ Sept1
## INTRO
-- Quand on décolle
-- Because it's there
- Ere de jeu
-- Ere de jeu
## TECHNO HIGH
-- Sunny
-- TechnOrage
......@@ -1857,9 +1851,45 @@ Sept1
# Montreuil Algorave V3: Mai Floral
_TechnoJazz_
BONSOIR <3
ParVagues et Shipow
[120] **Quand on Decolle** [transition into]
[124] Piment Bresilien [fade out?]
[124] *Take 5 Drops* [4+3]
[120] *Super Sunny Side* up -> [silence into 5]
[133] *W.A.P.*
[81->162] *'Plosive*
[140] **Jeudrill*
[160] *ARIA*
[170] *PunkAchien* [170-180bpm->down pure 8 breaks]
[166] *You My Sunshine*
[124] *Desire*
[124] *Blue Gold* [gagne du temps]
[~120] 6mn Sept1 <3
[104] 8m *Techno Orage*
-- Silence --
[101] 5mn **Outro: Sweet Revolution**
## Images
-- "/home/pln/Work/Art/GLITCHWAVE/outputs/digital_flow.gif"
-- url: "/home/pln/Work/Art/GLITCHWAVE/outputs/decolle.gif"
url: "/home/pln/Work/Art/GLITCHWAVE/outputs/digital_flow.gif"
url: "/home/pln/Work/Art/GLITCHWAVE/outputs/decolle.gif"
url: "/home/pln/Work/Web/www/next/public/images/parvagues/bg_live.gif"
url: "/home/pln/Downloads/PerfectSunriseLoop.gif"
url: "/home/pln/Work/Art/GLITCHWAVE/outputs/bg_live4.gif"
......
do
setcps (120/60/4)
let gMask = (midiOn "^41" (mask "t . <f t f <f t>> <t f f <t f>>"))
let gMute1 = (midiOn "^73" (mask "f*16"))
let gMute2 = (midiOn "^74" (mask "f*16"))
let gMute3 = (midiOn "^75" (mask "f*16"))
let gM1 = gMask . gMute1
let gM2 = gMask . gMute2
let gM3 = gMask . gMute3
let gF1 = (# djfbus 1 (range 0.05 0.95 "^49"))
let gF2 = (# djfbus 2 (range 0.05 0.95 "^50"))
let gF3 = (# djfbus 3 (range 0.05 0.95 "^51"))
let modIndex = pF "modIndex"
d1 $ gF1 $ gM1
$ "k k k k*<1 2>"
# "jazz"
# gain 1.3
d3 $ gF1 $ gM1
$ "hh*8"
# "h2ogmhh:1" # cut 3
d2 $ gF1 $ gM1
$ fast "<1!8 2!24>"
$ "~ [snare:20,cp]"
d4
$ slow 2
$ arp "updown"
$ note ("<c2 g2 c2 e2>"
+ "c'min'4/4"
)
# "bassWarsaw"
d8 $ gF1 $ gM1
$ midiOn "^60" (mask "t(4,8,1)")
$ loopAt 2
$ "jungle_breaks:45"
......@@ -183,7 +183,7 @@ d4 -- Brass voice
"", "c6@2 ~!3" -- bad
-- 76 TODO fin
])
# "brass" # "moogBass" -- FIXME RESTORE BRASS SAMPLES!
# "moogBass" -- FIXME RESTORE BRASS SAMPLES!
# legato "<0.75!7 1>"
# room 0.2
# gain 0.7
......
......@@ -19,6 +19,7 @@ d1 $ gF1 $ gM2
$ fix ((|* gain 0.9) . (# lpf 1000)) "jazz"
$ fix ((# att 0.02) . (# rel 0.5) . (# lpf 400)) "kick:4"
$ "[808bd:1,808bd:2,jazz,kick:4]"
# gain 1.4
d2 $ gF1 $ gM $ "~ sn <~ [~ sn]> sn" # note "0 0 -1 0" # legato "1 1 0.75 1"
# "[snare:5,snare:19]"
# room 0.4 # sz 0.1 # dry 1.1
......
......@@ -74,7 +74,7 @@ d8 $ gF1 $ gM1 -- Break multi-facette, assez complexe, comme chacun d'entre nous
$ midiOn "^60" (mask "t(4,8,<1!3 0>)" . chop 8)
$ midiOn "^36" (id . (loopAt 0.5 . (# "jungle_breaks:130")))
$ midiOn "^92" (mask "t(16,32)" . ply "2 2 <4 8 16 16> 2")
$ midiOn "^56" (loopAt 2 . (# n 12))
$ midiOn "^56" (loopAt 2 . (# n 141))
$ chop 16
$ loopAt 2
$ "jungle_breaks:1" # cut 8
......
do
resetCycles
-- resetCycles
setcps (160/60/4)
let gMask = (midiOn "^41" (mask "t . <f t f <f t>> <t f f <t f>>"))
let gMute1 = (midiOn "^73" (mask "f*16"))
......
......@@ -40,7 +40,7 @@ d3 $ gF1 $ gM1
d4 $ gF2 $ gM3
$ struct "t ~ t t ~ t ~ t?" -- Offbeat groove with probability
$ chordsRoot -- Auto-switches at bar 32!
|+| n "0 7 0 <4 2> 7 0 <[0 12] [7 4]>" -- Melodic bass line
|+| n "0 7 0 <4 2> 7 0 <[0 12] [7 4]>" -- Melodic bass linep
-- |+| n "0 7 4 <0 2> 7 <0 4> [7|12] 0" -- Alt: More melodic movement
-- |+| n "0 ~ 7 ~ [4|0] ~ 7 <0 2>" -- Alt: Sparser, half-time feel
# "bassWarsaw"
......
do
-- resetCycles
setcps (120/60/4)
let gMask = (midiOn "^41" (mask "t . <f t f <f t>> <t f f <t f>>"))
let gMute1 = (midiOn "^73" (mask "f*16"))
let gMute2 = (midiOn "^74" (mask "f*16"))
let gMute3 = (midiOn "^75" (mask "f*16"))
let gM1 = gMask . gMute1
let gM2 = gMask . gMute2
let gM3 = gMask . gMute3
let gF1 = (# djfbus 1 (range 0.05 0.95 "^49"))
let gF2 = (# djfbus 2 (range 0.05 0.95 "^50"))
let gF3 = (# djfbus 3 (range 0.05 0.95 "^51"))
let modIndex = pF "modIndex"
d1 $ gMute2 $ gF1 -- Kick solide
$ fix ((|* gain 0.9) . (# lpf 1000)) "jazz"
$ fix ((# att 0.02) . (# rel 0.5) . (# lpf 5000)) "kick:4"
$ midiOn "^42" (struct "t t t t*<1!6 2 2>")
$ midiOff "^42" (<| "k . ~ <~!3 k> ~ ~")
$ "[jazz,kick:4]"
# gain 1.2
-- # midiG' "^78" 0 1.5
d2$ gMute1 $ gF1 -- snare contretemps variable
$ fix ((|* gain 0.8) . (# legato 0.05)) "cp"
$ midiOn "^43" (<| "~ cp ~ cp*<1 1 2 <1 2>>")
$ midiOff "^43" (<| "~ [cp*<1!3 <2 <4 [4 2]>>> ~]")
$ "[vec1_claps:10]"
-- # pan 0.65
# gain 1.5
-- # legato 0.22
d3 $ gM1 $ gF1
$ "~ d ~ d ~ d ~ <d!12 [~ d]!3 [d d]>"
# "jazz:4"
# gain 1.4
# legato 0.3
# cut 3
d4 $ gF1 $ gM1
$ note ("<e3 b3 e3 g3>" - 12)
# "bassWarsaw"
# gain 1.3
# crushbus 41 (range 16 3.5 "^53")
# octersubbus 42 (range 0 1.5 "^33")
d5 $ gF1 $ gM1
-- $ midiOn "^90" (ply "4")
$ midiOn "^90" (stut 4 0.9 "q")
$ midiOn "^58" (slice 8 "<4 4 <4 5> 6>") -- Phase 2
$ midiOff "^58" (slice 16 "<[1 2] [1 2] [1 2] [3 4]>") -- Phase1
$ "latin:0"
# cut 5
# gain 1.2 # room 0.3 # sz 0.9 # lpf 4000
-- # begin 0.05
d8 $ gF1 $ gM1
$ midiOn "^92" (ply "1 <2!3 4>")
$ midiOff "^60" (mask "t(4,8,1)") -- Techno drum mask
$ midiOn ("^36" - "^56") ((# n "22")) -- Hmmm Break
$ midiOn "^56" ((# n "23")) -- Raise COMEON!
$ chop 16
$ loopAt 2
$ "jungle_breaks:45"
# cut 8
# gain 1.5
do
-- resetCycles
let gF1 = (# djfbus 1 (range 0.1 0.9 "^49"))
let gF2 = (# djfbus 2 (range 0.05 0.95 "^50"))
let gF3 = (# djfbus 3 (range 0.05 0.95 "^51"))
let gMask = (midiOn "^41" (mask "t . <f t f <f t>> <t f f <t f>>"))
let gMute = (midiOn "^73" (mask "f*16"))
let gMute2 = (midiOn "^74" (mask "f*16"))
let gMute3 = (midiOn "^75" (mask "f*16"))
let gM1 = gMask . gMute
let gM2 = gMask . gMute2
let gM3 = gMask . gMute3
let gMaskEnd16 = mask "<t!7 [<t f> <f t> ]>"
setcps (165/60/4)
-- d1 $ gF1 $ gM2
d1
$ gF1 $ gMute2
-- $ midiOff "^42" (<| "<k [~!7 k*<1 2>]>")
$ midiOff "^42" (<| "k . ~ k ~ ~")
$ midiOn "^42" (<| "k k . k <k [~ k] k k*2>")
$ "popkick:2"
-- # lpf 300 -- TODO Sound design this kick <3
-- # cut 1
# gain 2
d2 $ gF1 $ gM1
$ midiOff "^43" (<| "~ s ~ s*<1!3 2>")
$ midiOn "^43" (<| "~ . s*<1!3 2> ~")
$ "[realclaps:0]"
-- # "h2ogmcp"
-- # gain (1.0 * "<[1]!16 [1 <1 <1 [1 0.93] 1 [0.9]>>]!16>")
# gain 1.2
-- # room 0.5 # dry 1.1
-- # delay "<0!15 0.6!1>"
-- # delayt 0.25
d3 $ gF1 $ gM1
$ "~ h ~ h*<1!8 2!8> ~ h*<1 1 1> ~ h"
-- $ "h(3,8) h(3,8)"
-- # pan "0.2 0.8"
# "h2ogmhh:2"
# gain 1.3
# hpf 1500
-- # att 0.03 # rel 0.9
-- # legato (range 0.05 0.9 "^32")
d4 $ gF2 $ gM2
$ note ("<cs4 <c4 f4> [gs3@3 <~ bf3>] f3>" -12)
# "bassWarsaw"
# gain 1.3
# cut 4
# room 0.3
d5 $ gF2 $ gM2
$ note (
"<cs4 c4 [gs3@3 bf3] f3>"
+ (arp "up" "c'maj'4 c'maj'4")
)
# "FMRhodes1"
# modIndex (range 0 16 "^54")
# gain 1.3
# cut 5
# room 0.3
d8 $ gF1 $ gM1 $ loopAt 2
$ chop 8 $ "jungle_breaks:74" # cut 8
d4 $ gF2 $ gM3
-- $ midiOn "^57" (
-- superimpose (("e" ~>) .(|+ note 12) . (# cut 41)))
$ note ("0(3,8) . 0(3,8)" + "d"
+ "<0 0 0 0 7 7 5 0>"
)
-- # "moog:1"
# "bassWarsaw" |- note 36
# crushbus 41 (range 16 3.5 "^53")
# pan 0.4
# cut 4
# gain 1.5
d5 $ gF3 $ gM3 -- Les ptites keys de fin de session tranquilou
-- $ midiOn "^90" (ply "4 <8 16>")
$ slow 2
$ slice 8 "<0 1 2 3 4 5 6 7>"
$ "gfunk_lead:13" # cut 4
# gain 1.8
# crushbus 51 (range 16 3.5 "^54")
# pan 0.9
# room 0.3
d7 $ gF3 $ gM3 $ "trance_amb:0/2" # cut 7
d8 $ gF1 $ gM1
$ midiOff "^60" (mask "t(4,8,1)") -- Techno drum mask
$ midiOn "^36 " (loopAt 4 . (# "jungle_breaks:22")) -- Raise COMEON!
$ midiOn "^56" (loopAt 4 . (# "jungle_breaks:23")) -- Raise COMEON!
$ midiOn "^92" ( -- Bouton Nassim <3
slice 16 "[0 .. 7] . <[0 .. 7]!3 [0 1 . [2 3]]>"
. loopAt 1 . (# "breaks165")
-- . (# octer 0.4) . ( octersubsub 4)
. (# lpf 2500)
. (# room 0)
)
$ chop 16
$ loopAt 1
$ "breaks165"
# cut 8
# octersub 0.5
# gain 1.2
d9 $ gF3 $ gM3
$ midiOn "^19" (ply "4 8")
$ midiOff "^18" (mask "<f!3 t>")
$ "ouais" # n (slow 4 "<0 1 2 3>" )
# cut 9
# end "<1!12 0.47!3 1>"
# room 0.4
# gain 1.4
once $ "rampleS21:0"
......@@ -31,7 +31,7 @@ d3 $ gF1 $ gM1
)
$ midiOn "^44" (<| "~ h ~ h ~ h*<1!3 2> ~ h*<1 [1|2]>")
$ "h2ogmhh" # n "<0!4 1!3 2>"
# gain (1.4 * (range 0.9 1.2 perlin))
# gain (0.9 * (range 0.9 1.2 perlin))
d4 $ gF2 $ gM3
$ midiOn "^89" (ply 4)
$ slow 2 $ note ("<[e3@7 f3]!4 [b2@7 c2]!4>")
......@@ -58,10 +58,12 @@ d5 $ gF2 $ gM3 --
# gain 1.4
# squizbus 51 (range 0 2.5 "^54")
d7 $ gF3 $ gM3
$ midiOn "^89" (ply 4)
$ midiOn "^91" (ply 4)
-- $ slow 2
$ note (
"<e3!4 b2!4>")
"<e3!4 b2!4>"
+ (arp "up" "c'majPent'4")
)
# "acidOto3091"
# cut 4
# crushbus 41 (range 16 2.5 "^53")
......
do
-- resetCycles
resetCycles
setcps (129/60/4)
d1 $ gF1 $ gMute2 -- KICK: Sub thud, 4otf with flourish (NTO: deepens over time)
$ midiOn "^42" (<| "k k k <k k*2 k [~ k]>") -- ON: 4otf + flourish variations
......
......@@ -36,7 +36,7 @@ d3 $ gF1 $ gM1
-- $ "h(3,8) h(3,8)"
# pan "0.2 0.8"
# drumFrom "rolandtr909" "hh:2" # cut 3
# gain 1.2
# gain 1.3
# legato (range 0.05 0.9 "^32")
d9 -- Bogdan the Grime sample provider
$ whenmod 16 12 ( -- I'm from Cardiff!
......@@ -91,8 +91,8 @@ d5 $ gM3 $ gF3 -- Marimba fondamental
# rel 1
-- # squizbus 51 (range 0 2.5 "^54")
-- # delay 0 # delayfb 0.8 # delayt 0.25
# pan 0.9
# gain 1.6
# pan 0.8
# gain 2
# room 0.3
d10 $ gF3 $ gM3 -- Menace
$ someCyclesBy "<1!16 1!32 0!16>" (>| note "<b3 ~ ~ <[~!7 c4] [~!5 c4 ef4 <c4 fs4>]>>")
......
......@@ -22,7 +22,7 @@ d2 $ gF1 $ gM1
# octersub 0
# octersubsub 0
# pan 0.25
-- # lpf 3000
-- # lpf 3000
d3 $ gF1 $ gM1
$ midiOn "^76" (ply 2)
$ sometimesBy "0 <0.5!3 2>" (mask "t(<12!3 2>,16)")
......
......@@ -16,20 +16,24 @@ d1 $ gF1 $ gM2
# gain 1.7
# lpf 400
d2 $ gF1 $ gM1
$ midiOn "^43" (mask "[t <f t!3>] [t <f t>]" . fast 2)
$ "~ s ~ [s*<1 2> <~ s*<2 [4 2]>>]"
# "vec1_claps" # n 10
# gain 1.3
# lpf 2000
d3 $ gF1 $ gM1
$ midiOn "^44" (<| "[~ h*<1!3 <1 2 [4 2] 1?>>]*4" )
$ midiOff "^44" (<| "h(4,8,1)")
$ midiOff "^44" (<| "h(3,8) h([3 1 3],8)")
$ "h2ogmhh"
# gain 1.4
# room 0.3
# dry (slow 16 $ range 0.2 1.8 perlin)
# legato (range 0.05 2 "^52")
# sz 0.4
d4 $ gF3 $ gM3
$ struct "t . t(<1 3 5>,8)"
d4 $ gF2 $ gM3
$ midiOn "^89" (struct "t . t(<1 3 5>,8)")
$ midiOn "^57" (struct "t . t(<1 3 5>,8)")
$ midiOff "^57" (struct "<t!3 t*[<4 8> [8 <8 16>]]>")
$ note (
"<bf2 bf2 bf2 [bf2@7 cs3]>"
+ "[0,12]"
......@@ -39,6 +43,7 @@ d4 $ gF3 $ gM3
-- |+ note 12
# room 0.3
# crushbus 41 (range 16 3.5 "^53")
# octerbus 42 (range 0 1.85 "^33")
# room 0.2 # dry 1.2 # sz 0.7
# gain 1.4
d5 $ gF3 $ gM3 -- LE PIMENT BRESILIEN
......@@ -51,7 +56,7 @@ d5 $ gF3 $ gM3 -- LE PIMENT BRESILIEN
# gain 1.7
# room 0.3
# octerbus 51 (range 0 1.4 "^54")
# octersubbus 52 (range 0 2 "^34")
# octersubbus 52 (range 0 4 "^34")
d7 $ gF3 $ gM3
$ midiOn "^91" (ply 2)
$ note ("[f3 cs3 c3 cs3 f3 cs3 <c3 f3> <cs3 fs3>]"
......@@ -83,6 +88,7 @@ d8 $ gF1 $ gM1 -- La Boite à breaks de ParVagues <3
$ "jungle_breaks:45"
# cut 8
# gain 1.4
# pan "0.5!3 <0.2 0.8>"
--
--
--
......
......@@ -81,7 +81,7 @@ d8 $ gF1 $ gM1
. (# lpf 2500)
. (# room 0)
)
$ midiOff "^60" (mask "f(8,16)" . chop 16)
$ midiOn "^60" (mask "f(8,16)" . chop 16)
$ midiOn "^56" (# "jungle_breaks:7")
$ midiOn "^36" (# "jungle_breaks:37")
$ chop 16 $ "jungle_breaks:101"
......
-- url: "/home/pln/Work/Art/GLITCHWAVE/outputs/decolle.gif"
do
resetCycles
-- resetCycles
setcps (120/60/4)
let gMask = (midiOn "^41" (mask "t . <f t f <f t>> <t f f <t f>>"))
let gMute = (midiOn "^73" (mask "f*16"))
......@@ -16,10 +16,10 @@ d1 $ gF1 $ gM2
$ fix ((|* gain 0.9) . (# lpf 1000)) "jazz"
-- $ fix ((# att 0.02) . (# rel 0.5) . (# lpf 400)) "kick:4"
$ "[jazz,kick:4]"
# gain 1.1
# gain 1.4
# lpf 300
d2 $ gF1 $ gM1
$ midiOff "^43" (<| "~ . s@3 <~ s*<1 <2 [4 2]>>>")
$ midiOff "^43" (<| "~ . s@3 <~ s*<1 <2 [4 2]>>>")
$ midiOn "^43" (<| "~ s ~ <s!3 s*<2 [4 2]>>")
$ fix (# lpf 4000) "snare:30"
$ "[snare:30]"
......@@ -33,7 +33,7 @@ d3 $ gF1 $ gM1
# att (slow 32 $ range 0.4 0.04 saw)
# rel 2
# room 0.2 # dry 1.3
# gain 1.6
# gain 1.9
d4 $ gF2 $ gM3
$ midiOn "^57" (sometimesBy 0.5 ((|- note 12) . (# cut 41)))
$ midiOn "^89" (ply 2)
......@@ -60,13 +60,13 @@ d5 $ gF3 $ gM3
# room 0.4 # sz 0.8 # dry 1.1
-- # crushbus 51 (range 16 3.5 "^54")
d7 $ gF3 $ gM3
-- $ midiOn "^91" (ply "<2 4 <8 [16 8]>>")
$ midiOn "^91" (ply "<2 4 <8 [16 8]>>")
-- $ slow 4
$ midiOn "^55" (slow 4)
$ midiOn "^59" (slow 4)
-- $ slice 16 (run 6)
$ slice 16 (8 + (slow 2 $ "<0 4 8 12>"))
$ "airports" # cut 5 # speed 0.5
# gain 1.2
# gain 1.4
# room 0.4
# att 0.02
# rel 2
......
......@@ -27,6 +27,7 @@ d2$ gMute1 $ gF1 -- snare contretemps variable
$ midiOff "^43" (<| "~ [cp*<1!3 <2 <4 [4 2]>>> ~]")
$ "[cp,snare:24]"
# pan 0.65
# gain 1.4
-- # legato 0.22
d3 $ gM1 $ gF1
$ "~ d ~ d ~ d ~ <d!12 [~ d]!3 [d d]>"
......
do
resetCycles
-- resetCycles
setcps (120/60/4)
let gMask = (midiOn "^41" (mask "t . <f t f <f t>> <t f f <t f>>"))
let gMute1 = (midiOn "^73" (mask "f*16"))
......
......@@ -21,7 +21,7 @@ d2 $ gF1 $ gM1 -- Snare FOU
$ midiOn ("^43" - "^75") (<| "~ s ~ <s s*<1!7 2> s s*2>")
$ midiOff ("^43"- "^75") (<| "~ s")
$ "[sn:25,gretsch:4]"
# note (range "-4" 4 "^51") show
# note (range "-4" 4 "^51")
# gain 0.7
d3 $ gF1 $ gM1
$ midiOn "^44" (ply "1 2 1 <2 <1 4>>")
......
......@@ -7,7 +7,8 @@
once $ "xplosive" -- RIFF
# cut 1
-- # cut 6
# orbit 4
# lpf 400
# room 1
-- # freeze 0.2
......@@ -17,7 +18,7 @@ once $ "xplosive" -- RIFF
once $ "xplosive:3" -- HOES
# gain 0.9 # cut 7
# gain 0.9 # orbit 4
-- REAL SMOKERS
do
......@@ -88,7 +89,7 @@ d7 $ gF3 $ gM3 -- VOICES
# gain 1.2
d8 $ gF1 $ gM1
$ midiOff "^60" (mask "t(8,16,1)" . chop 8)
$ chop 8
$ chop 8
$ loopAt 0.5
$ midiOn "^36" (loopAt 2 . (# "jungle_breaks:39"))
$ midiOn "^56" (loopAt 2 . (# "jungle_breaks:42"))
......
......@@ -31,7 +31,6 @@ d4 $ gF2 $ gM3 -- WAP BASS
$ midiOn "^57" (
slice 8 ("~ 0 <~ ~ 5 5> 3 <~ 0!3> <~!4 0!10 ~ 0*4> 5 <~ 5>")
-- $ (0.125 ~>) :
. (# gain 1.3 )
. (# crushbus 43 (range 16 3.4 "^53") )
. (# lpf 3000)
......@@ -55,7 +54,7 @@ d5 $ gF3 $ gMute3 -- WAP HOES v1 magic repeat
$ midiOn "^58" (stut "4" 0.9 (fast 4 "e"))
$ midiOn "^90" (
ply "[1!3 4]*4" . chop 4 . -- Magic Repeat: next segment instead
stut "4" 0.9 (fast 4 "s") -- Magic Repeat: repeater
stut "2" 0.9 (fast 2 "s") -- Magic Repeat: repeater
. (# att 0.08)
. (# rel 10)
)
......
do
-- resetCycles
setcps (114/60/4)
d1 $ gF1 $ gM2
$ sometimesBy "^30" (fast 2)
$ midiOn "^42" (<| "k k k k*2")
$ midiOff "^42" (<| "k . k(3,8)")
$ stack [
"kick:5" # gain 1.4 # lpf 200, -- character (KICK16, click+body)
"bd:5" # gain 1.0 # lpf 90 # hpf 25 -- sub thump (90% sub @ 43Hz)
]
-- alt punchier replacement: "hardkick:5" (sub + 9% mid click, distorted)
d2 $ gF1 $ gM1
$ midiOn "^43" (<| "~ <s!4 [~ s] s s s*2> ~ <s [s s*<1 2>]>")
$ midiOff "^43" (<| "~ s")
$ stack [
"cp:1" # gain 1.05 # speed 0.95, -- 80s hand clap (HANDCLPA)
"snare:54" # gain 0.65 # hpf 280, -- existing snare, crack only
"808sd:5" # gain 0.5 # hpf 180 -- 808 body underneath
]
-- # room 0.45 # sz 0.55
-- # delay 0.2 # delayt "e" # delayfb 0.25
d3 $ gF1 $ gM1
$ stack [
-- light closed offbeats, velocity-layered
"~ h ~ h ~ h ~ h*<1 1 2 [2 4]>"
# n "<2 3 4 3>" -- Med/Soft/Softest closed
# gain (range 0.42 0.62 (slow 5 sine)),
-- open hat once every 4 cycles, last 8th note (NTO breath)
"~ ~ ~ ~ ~ ~ ~ <~!3 1>"
# n 7 -- HatOpen-Med
|* gain 0.65
]
# s "h2ogmhh"
# gain 1.4
d4 $ gF2 $ gM3
$ midiOn "^57" (# n 3)
$ midiOff "^57" ( -- MONTEE
whenmod 16 12 (# n "<[1 2] 2*2>"))
$ midiOff "^57" (slice 4 "<[0 1] [2 3]>")
$ "like_sugar:0" # cut 4
# gain 1.4
-- # room 0.3 # sz 0.3
-- # delay 0.6 # delayt 0.01 # delayfb 0.2
# crushbus 41 (range 16 3.5 "^53")
# bandf (range 50 1200 "^33")
d5 $ gF3 $ gM3
$ slow 2 -- Adjusted to Sugar rhytm <3
$ midiOn "^90" (ply "<4!3 8>" . (# begin "0 <0 0.25> 0.5 0.5"))
-- $ ply 4
-- $ slow 4
$ fix (# begin "<0 0 [0@3 0.7] 0.7>") (n 12) -- Sex appeal
$ fix (# begin "<0!3 [0.7!3 0.55]>") (n 13) -- Sex appeal
$ n (cat [
"0", "~" , "0" , "~ [0*[4 2] ~]", -- Brother
"1", "1 2", "2 0", "2", -- You can't plug out
"~", "~", "3", "~", -- Lose yourself
"4", "~", "<5 <19 21>>", "~", -- Revolution
"6", "~", "6", "~", -- Commercials
"7", "8", "9", "10", -- Nixon
"31", "~", "~", "~", -- NOT BE TELEVISED
"11", "12", "12@3 12", "12*[4 4 [4 8] [8 16]]", -- Sex Sex!!
"13", "~", "13", "13*[4 4 8 4]", -- The Nubs
"14", "15", "~", "0", -- Not five pounds thinner
"16", "17", "18", "19" -- STOLEN AMBULANCE
])
# "the_revolution"
# cut 5
# gain 1.5
-- # end 0.6
-- # begin 0.65
-- # begin 0.82
# room 0.4
# sz 0.4
# delayt "q"
# delay (slow 8 $ range 0 0.9 perlin)
# delayfb (slow 16 $ range 0 0.24 perlin)
# pan 0.8
d7 $ gF2 $ gM3 -- LEAD: Rhodes arp in D Dorian (i7 → IV7 → bIII → v)
$ midiOn "^59" (jux rev)
$ midiOff "^59" (degradeBy 0.15)
$ sometimesBy "^31" (# squiz "<1 2 3 1>")
$ fast 2
$ arp "<up updown down converge up updown thumbup converge>"
$ note "<d3'min7 g3'7 f3'maj7 a3'min7>"
# s "FMRhodes1"
# cutoff (range 1200 4500 "^54")
# resonance (range 0.1 0.3 "^55")
# room 0.6 # sz 0.5
# delay 0.5 # delayt "q" # delayfb 0.35
# pan 0.3
# gain 1.1
# modIndex (slow 16 $ range 0.4 2.5 perlin)
# legato 0.9
d8 $ gF1 $ gM1
$ midiOn "^92" (ply "<2 <4 [4 8]>>")
$ midiOff "^60" (mask "t(8,16,1)" . chop 16)
$ chop 16
$ loopAt 2
$ midiOn "^36" (# n "102")
$ midiOn "^56" (loopAt 0.5 . (# n "42"))
$ "jungle_breaks:45"
# cut 8
# gain 1.3
# lpf 4000
d9 $ gF3 $ gM3 -- SUGAR CHOIR
$ "like_sugar/2"
# n (slow 2 "<9 10 11 12 9 10 11 12 12 12 12 13 12 14 15 16>")
# cut 9
# room 0.4 # sz 0.3
d10 $ gF3 $ gM3 -- SUGAR KEY SWEET TRIGGER
$ "like_sugar:21"
-- # end 0.92 # speed 1.2
# room 0.4 # sz 0.4 # dry 0.9
# cut 10
d11 $ gF3 $ gM2 -- SUGAR GLITCH: stuttered chops + bitcrush
-- $ midiOn "^61" (stut 4 0.6 0.125)
-- $ sometimesBy "^31" (hurry "<1 2 0.5 [2 4]>")
$ every 4 (rev . chop 32)
$ chop "<8 16 [16 32] 8>"
$ "like_sugar/2"
# n "<10 11 12 9 13 14 15 16>"
# cut 11
-- # coarse (slow 4 $ range 0 10 sine)
-- # squiz "<1 1 2 1>"
-- # crush (range 12 6 "^59")
# room 0.3 # sz 0.5
# delay 0.3 # delayt "e" # delayfb 0.4
# pan "<0.35 0.65>"
# gain 1.0
d12 -- HEY HEY!
$ chop 8
$ "like_sugar:20/4"
# room 0.5
# gain 0.8
# pan "[0.2 0.8]*8"
once $ "bumbum"
do
setcps (135/60/4)
d1 $ gF1 $ gM2
$ midiOn "^41" (mask "<t f> <f!3 [f t]>")
$ midiOn "^42" (<| "k k k k")
$ midiOff "^42" (<| "k . k(<3!7 8>,<9 8 8 9>)")
$ "[rampleK2,jazz]"
# gain 1.3
d2 $ gM1 $ gF1
$ "~ s ~ <s <s*2 [s s s ~]>>"
# "[rhadamanthe_fx:187,realclaps]" -- POPPING SNARE
# begin 0.048 # end 0.055
# gain 3
# room 0.4 # sz 0.8 # dry 1
d3 $ gM1 $ gF1 $ "hh(3,8) hh(3,8)"
# "rampleS20:3"
# gain 1.8
d4 $ note "<as2 [a2@3 <~ [cs2 c3]>]>"
# "bassWarsaw"
# gain 1.3
d5 $ gF3 $ gM3
-- $ slice 2 "<0 1>" $ n "<8!4 9!4>" # "bumbum" -- WAIT
$ slice 2 "<0 1>" $ n (slow 2 $ "<4 5 6 7>") # "bumbum" -- RUN
# cut 5
# gain 1.4
d7 $ gF3 $ gMute3
$ midiOn "^91" (ply 4)
$ midiOn "^35" ((>| "bumbum:25") . (# begin 0.08))
$ fix ("s" <~) (n 10) -- Calage
$ fix (0.5 ~>) (n 11) -- Calage
$ fix (0.25 ~>) (n 12) -- Calage
$ fix (0.25 ~>) (n 13) -- Calage
$ fix (0.25 ~>) (n 14) -- Calage
$ slice 2 "<0 1>"
-- $ n (slow 2 $ "<10 11 12 13 14 15 16 17>" ) -- Wait1
-- $ n (slow 2 $ "<13 13 ~ ~ 15 16 15 16>") -- Wait2
-- $ n (slow 2 $ "<17 17 18 18 17 17 18 19>") -- CALL
-- $ n (slow 2 $ "<<20 21> <20 22> 20 <19 21 24 25>>") -- BOM BOM
-- $ n (slow 2 $ "<<20 21> <20 22> 20 <19 21 24 25>>") -- BOM BOM
$ n (slow 2 $ "<10 11 12 13 14 15 16 17 13 13 ~ ~ 15 16 15 16 17 17 17 17 18 18 17 17 18 19 20 20 20 19 21 22 23 24>") -- CALL
# "bumbum"
-- # cut 7
# gain 1.3
d8 $ gF1 $ gM1 $ loopAt 4
$ chop 16
$ "jungle_breaks:123"
# gain 1.2
d9 $ gF3
$ mask "t <f t>"
$ ply 2
$ n "<0 ~ ~ 1 0 ~ 3 ~ 0 <1 3> <[2 3 2 3] [~@3 2*2]> 3 ~>"
# "bumbum" # cut 9
# gain 1.3
......@@ -16,7 +16,7 @@ let lagTime = pF "lagTime"
let filterRange = pF "filterRange"
d1 $ gF1 $ gM2
$ midiOn "^42" (<| "k k k k*2")
$ midiOff "^42" (<| "k")
$ midiOff "^42" (<| "k . ~!3 <~ [~|k?]!6 k>")
-- $ fix ((|* gain 0.9) . (# lpf 1000)) "jazz"
$ fix ((# att 0.02) . (# rel 0.5) . (# lpf 400)) "kick:4"
$ "[kick:4,jazz]"
......@@ -40,7 +40,7 @@ d3 $ gF1 $ gM -- Hats closed legers
|* gain 1.5 * ("~ 1 ~ 0.9 ~ 1 ~ 0.8")
d6 $ gF1 $ gM -- Hats closed legers
$ midiOff "^44" (mask "t(4,8)")
$ "h2ogmhh:5*8"
$ "h2ogmhh:5*8" -- FIXME: "C'est pas le meilleur celui-la -- DJ Micka"
# legato 0.5
# note "<2!2 -1!2>"
# room 0.3 # sz 0.13 # dry 1.1
......@@ -98,7 +98,7 @@ d7 $ gM3 $ gF2 -- LA ACID BASS ARE YOU SUNNY NOW ?? <3
-- "[0*4]*<2!2 <2 4> [2 4]>" -- Mechanic rhytm
"0(3,8) 0(<3!3 5>,8)"
+ "f gs c g"
+ 12
-- + 12
-- + 1 -- Calage
)
-- # "vec1_acid:21" |+ note 1 -- Option 1: Samples ACIDES
......
do
-- resetCycles
setcps (124/60/4)
let gMask = (midiOn "^41" (mask "t . <f t f <f t>> <t f f <t f>>"))
let gMute1 = (midiOn "^73" (mask "f*16"))
......@@ -9,6 +10,7 @@ let gM2 = gMask . gMute2
let gM3 = gMask . gMute3
d1 $ gF1 $ gM2
$ midiOn "^42" (<| "k k k <k [<~!3 k> k]>")
$ midiOn "^42" (<| "k k k <k [<~!3 k> k]>")
$ midiOff "^42" (<| "k . <[~ k] k(<3 5>,8)>")
$ "[techno:0,808bd:2,909,kick:4]"
-- $ "kick:5"
......@@ -21,8 +23,8 @@ d2 $ gF1 $ gM1
# gain 1.3
# lpf 2000
d3 $ gF1 $ gM1
$ midiOn "^44" (<| "[~ h*<1!3 <1 2 [4 2] 1?>>]*4" )
$ midiOff "^44" (<| "h(4,8,1)")
$ midiOn "^44" (ply 2 . (<| "h(4,8,1)"))
$ midiOff "^44" (<| "[~ h*<1!3 <1 2 [4 2] 1?>>]*4" )
$ "h2ogmhh"
# gain 1.4
# room 0.5
......@@ -30,7 +32,7 @@ d3 $ gF1 $ gM1
# sz 0.4
# legato (range 0.3 2 "^52")
d5 $ gF3 $ gM3
$ midiOn "^18" (fast 2)
$ midiOn "^18" (# n "15")
$ midiOn "^90" (ply "<2 2 1 2 2 4 [4 2 8 4] 8>")
$ slice 4 "<0 1 2 3*<1!3 <2 4 [4 1]>>>"
$ midiOn "^34" (
......@@ -48,7 +50,7 @@ d5 $ gF3 $ gM3
# dry (slow 4 $ 1 + 0.4 * perlin)
# pan 0.8
d4 -- BASSLINE GENERATIVE
$ gF3 $ gM3
$ gF2 $ gM3
$ midiOn "^57" (superimpose (
degradeBy "0 <0!3 0.2>!6 <0.2!3 0.5>" .
(|+| note "[0 7 2 12]*4")
......@@ -91,13 +93,14 @@ d11 $ gF3 $ gM3 -- THE FLUTIST
$ n (slow 8 $ "<13 14>")
# "take5" # cut 11
# room 0.3 # sz 0.5 # dry 0.2
# gain 1.3
# gain 0.8
d12 $ gF3 $ gM3 -- THE SLEEPWALKER
$ slice 4 "<0 1 2 3>"
$ n (slow 8 $ "<18 19 20 31 22 23 24 24>")
# "take5" # cut 11
# room 0.3 # sz 0.5 # dry 0.2
# gain 1.5
# pan 0.2
# gain 1.1
d8 $ gF1 $ gM1 -- La Boite à breaks de ParVagues <3
$ midiOn "^92" (ply "1 <2!3 4>")
$ midiOff "^60" (mask "t(4,8,1)") -- Techno drum mask
......
......@@ -128,6 +128,7 @@ d8 $ gF1 $ gM1
$ "breaks165"
# cut 8
# gain 1.2
# pan (slow 4 $ range 0.9 0.1 sine)
d9 $ gF2 $ gM3-- slow arpeggiated synth, high register
$ mask "t <f!8 t!8> <f!4 t!4> <f!8 t!8>"
$ fast 4
......@@ -138,7 +139,7 @@ d9 $ gF2 $ gM3-- slow arpeggiated synth, high register
# delay 0.5 # delaytime (1/3) # delayfb 0.4
# lpf 1400
# cut 9
d10 -- Euclidian mid arps
d10 -- Euclidian mid arpss
$ struct "t(5,8,2)"
$ note (slow 2 $ "<bf3 cs4 ef3 bf3>" + "<0 7 12>")
# s "moogBass"
......
......@@ -60,6 +60,7 @@ d4 $ gF2 $ gM3 -- BASS <3
# crushbus 41 (range 16 4 "^53")
# octerbus 42 (range 0 0.93 "^33")
d5 $ gF3 $ gM3 -- Rain piano <3
$ (0.05 ~>)
$ midiOn "^41" (mask "<t f>")-- Mask norepeat
$ midiOn "^90" (slice 2 "<0 0 1 1>")
$ midiOn "^34" ((>| n "<<4!4 34 4!3> 4 33 <34 4>>")) -- ORAGE INFINI
......@@ -118,10 +119,10 @@ d7 $ gF3 $ gM3 -- Voices
$ n (cat [
-- "<0 ~ 1 ~ 2 ~ 3 ~>" -- Riders 1
-- "<0 ~ ~ ~ 1 ~ ~ ~ 4 ~ ~ 4 5 ~ ~ ~>" -- Riders 2
"<<0 6> ~ ~ ~>" -- Road Killer
-- "<<0 6> ~ ~ ~>" -- Road Killer
-- "<~ ~ <0 1 7 ~> ~>" -- Squirming Brain
-- "<8 8 9 8>" -- Children Holiday
-- "<11!6 12 <~ 13>>" -- Love
"<11!6 12 <~ 13>>" -- Love
-- "11" -- Love
]
+ 45)
......
do
-- resetCycles
setcps (89/60/4)
d1 $ fast 2
$ gF1 $ gMute2
-- $ midiOff "^42" (<| "<k [~!7 k*<1 2>]>")#
$ midiOn "^30" (# "jazz:0")
$ midiOff "^42" (<| "k . ~ k ~ ~")
$ midiOn "^42" (<| "k k . k <k [~ k] k k*2>")
$ "popkick:2"
# lpf 300 -- TODO Sound design this kick <3
-- # cut 1
# gain 2
-- # midiG' "^78" 0 1.5
d2 $ fast 2 $ gF1 $ gM1
$ midiOn "^43" (<| "~ s ~ s*<1!3 <2 [4 2]>>")
$ midiOff "^43" (<| "~ . s*<1!3 2> ~")
$ "[realclaps:0]"
-- # "h2ogmcp"
-- # gain (1.0 * "<[1]!16 [1 <1 <1 [1 0.93] 1 [0.9]>>]!16>")
# gain 1.2
-- # room 0.5 # dry 1.1
-- # delay "<0!15 0.6!1>"
-- # delayt 0.25
d3 $ gM1 $ gF1
$ fast "<1!8 2!6 4>"
$ "~ d ~ d ~ d ~ <d!12 [~ d]!3 [d d]>"
# "snare:34"
# hpf 7000
# gain 1.4
d4 $ gF2 $ gM3
$ note "[<as2 cs3 f3 cs3> <b2 ef3 fs3 b2>@7]"
# "bassWarsaw" # cut 4
# room 0.4 # sz 0.8 # dry 0.9
# octersubbus 42 (range 0 1.8 "^33")
# crushbus 41 (range 10 4.5 "^53")
# gain 1.5
d5 $ gF3 $ gM3
$ midiOn "^90" ((# begin "0 0.5") . ply "<4!7 [8 16]>")
$ slice 4 "<0 1 2 3 4 5 6 7>"
$ "daft" # n "<0!8 1!8>"
# cut 5
# gain 1.3
# dry 1.3 # sz 0.8 # room 0.4
# pan "0.3!3 0.7"
# octersubbus 51 (range 0 0.8 "^34")
# octerbus 52 (range 0 0.4 "^34")
# crushbus 53 (range 16 5 "^54")
d7 $ gF3 $ gM3
$ midiOn "^35" (# n 3)
$ midiOn "^91" (ply "<4!3 [8 16]>")
$ slice 4 "<0 1 2 3 4 5 6 7>"
$ "daft" # n "2"
# cut 7
# gain 1.3
# dry 1.3 # sz 0.8 # room 0.4
# pan "0.7!3 <0.6 0.4>"
# room 0.3 # sz 0.4
d8 $ gF1
$ gM1
$ midiOn "^92" (ply "<2 2 2 <4 8>>")
$ midiOff "^60" (mask "t(8,16,1)" . chop 16)
$ chop 8
$ loopAt 1
$ midiOn "^36" (loopAt 0.5 . (# n 135))
$ midiOn "^56" (# n 55)
$ "jungle_breaks:74"
# cut 8
d12 $ gF3 $ gM3
$ arp "up"
$ note ("c'min7 c'min7"
+ (slow 2 "<gs ef>")
+ "<0 12>"
)
# "FMRhodes1"
# modIndex (range 0 16 "^31")
# room 0.5
# sz 0.4
# gain 1.2
# pan 0.7
This diff is collapsed. Click to expand it.
......@@ -127,3 +127,10 @@ once $ "impulseSync"
once $ note "[c4 g4 c4 d4]*4" # "acidOto3091"
once $ "ai_welcome:0" # cut 2
d1 $ slow 4
$ arp "up"
$ note "c3'maj'4"
# "sine"
/home/pln/Work/Sound/tidal-ears/src/tidal_ears/analyze_samples.py
\ No newline at end of file
#!/bin/bash
# Validate both laptop fans spin and ramp under thermal load.
# Stresses CPU, samples fan RPM + core temp over time, then idles and watches ramp-down.
# Verdict: both fans must climb under load, stay in lockstep, and drop on idle.
# Usage: sudo ./fan_check.sh
set -u
rebind() {
HWMON=$(echo /sys/devices/platform/dell_smm_hwmon/hwmon/hwmon*)
PWM1="$HWMON/pwm1"; PWM2="$HWMON/pwm2"
PWM1E="$HWMON/pwm1_enable"; PWM2E="$HWMON/pwm2_enable"
FAN1="$HWMON/fan1_input"; FAN2="$HWMON/fan2_input"
}
rebind
if [ "$EUID" -ne 0 ]; then
echo "needs root: sudo $0"
exit 1
fi
NCPU=$(nproc)
STRESS_S=30
COOLDOWN_MAX_S=120 # cap on cooldown wait
COOL_TEMP=65 # °C — CPU must sit below this...
COOL_HOLD_S=10 # ...for this long before we trust the steady state
SAMPLE_DT=2
cpu_temp() {
sensors coretemp-isa-0000 | awk '/Package id 0/{gsub(/[+°C]/,"",$4); print $4; exit}'
}
sample() {
printf " t=%2ds fan1=%4s fan2=%4s Δ=%4s cpu=%s°C pwm=%s/%s\n" \
"$1" "$(cat "$FAN1")" "$(cat "$FAN2")" \
"$(( $(cat "$FAN1") - $(cat "$FAN2") ))" \
"$(cpu_temp)" "$(cat "$PWM1")" "$(cat "$PWM2")"
}
# Background CPU stress. Prefer stress-ng, fall back to N busy-yes loops.
start_load() {
if command -v stress-ng >/dev/null 2>&1; then
stress-ng --cpu "$NCPU" --timeout "${STRESS_S}s" >/dev/null 2>&1 &
LOAD_PID=$!
LOAD_KIND=stress-ng
else
LOAD_KIND="yes×$NCPU"
LOAD_PIDS=()
for _ in $(seq "$NCPU"); do
yes > /dev/null &
LOAD_PIDS+=("$!")
done
fi
}
stop_load() {
if [ "${LOAD_KIND:-}" = "stress-ng" ]; then
wait "$LOAD_PID" 2>/dev/null || true
else
for p in "${LOAD_PIDS[@]:-}"; do kill "$p" 2>/dev/null || true; done
wait 2>/dev/null || true
fi
}
trap 'stop_load 2>/dev/null || true' EXIT INT TERM
echo "=== baseline (idle, 6s) ==="
for t in 0 2 4 6; do sample "$t"; sleep "$SAMPLE_DT"; done
BASE_F1=$(cat "$FAN1"); BASE_F2=$(cat "$FAN2"); BASE_T=$(cpu_temp)
echo
echo "=== LOAD ${STRESS_S}s ($NCPU cores via $(command -v stress-ng >/dev/null && echo stress-ng || echo 'yes×N')) ==="
start_load
PEAK_F1=$BASE_F1; PEAK_F2=$BASE_F2; PEAK_T=$BASE_T
for t in $(seq 0 "$SAMPLE_DT" "$STRESS_S"); do
sample "$t"
f1=$(cat "$FAN1"); f2=$(cat "$FAN2"); tt=$(cpu_temp)
[ "$f1" -gt "$PEAK_F1" ] && PEAK_F1=$f1
[ "$f2" -gt "$PEAK_F2" ] && PEAK_F2=$f2
# tt is float ("68.0") — compare via awk
PEAK_T=$(awk -v a="$PEAK_T" -v b="$tt" 'BEGIN{print (b>a)?b:a}')
sleep "$SAMPLE_DT"
done
stop_load
echo
echo "=== COOLDOWN (wait until CPU < ${COOL_TEMP}°C for ${COOL_HOLD_S}s, max ${COOLDOWN_MAX_S}s) ==="
held=0; t=0; END_F1=0; END_F2=0; END_T=0
while [ "$t" -le "$COOLDOWN_MAX_S" ]; do
sample "$t"
tt=$(cpu_temp)
below=$(awk -v a="$tt" -v b="$COOL_TEMP" 'BEGIN{print (a<b)?1:0}')
if [ "$below" = "1" ]; then
held=$(( held + SAMPLE_DT ))
else
held=0
fi
if [ "$held" -ge "$COOL_HOLD_S" ]; then
echo " [cooled] CPU sat below ${COOL_TEMP}°C for ${held}s — capturing end state"
END_F1=$(cat "$FAN1"); END_F2=$(cat "$FAN2"); END_T="$tt"
break
fi
sleep "$SAMPLE_DT"
t=$(( t + SAMPLE_DT ))
done
if [ "$END_F1" = "0" ]; then
echo " [timeout] never settled below ${COOL_TEMP}°C — using last sample"
END_F1=$(cat "$FAN1"); END_F2=$(cat "$FAN2"); END_T=$(cpu_temp)
COOL_TIMEOUT=1
else
COOL_TIMEOUT=0
fi
echo
echo "=== VERDICT ==="
printf " baseline: fan1=%s fan2=%s cpu=%s°C\n" "$BASE_F1" "$BASE_F2" "$BASE_T"
printf " peak load: fan1=%s fan2=%s cpu=%s°C\n" "$PEAK_F1" "$PEAK_F2" "$PEAK_T"
printf " post-cool: fan1=%s fan2=%s cpu=%s°C\n" "$END_F1" "$END_F2" "$END_T"
DELTA_F1=$(( PEAK_F1 - BASE_F1 ))
DELTA_F2=$(( PEAK_F2 - BASE_F2 ))
PEAK_DIFF=$(( PEAK_F1 - PEAK_F2 ))
[ "$PEAK_DIFF" -lt 0 ] && PEAK_DIFF=$(( -PEAK_DIFF ))
# Climb test: both fans must gain meaningfully (>=300 RPM) under load.
if [ "$DELTA_F1" -ge 300 ]; then echo " [OK] fan1 climbed +$DELTA_F1 RPM under load"
else echo " [!!] fan1 only +$DELTA_F1 RPM — weak response"; fi
if [ "$DELTA_F2" -ge 300 ]; then echo " [OK] fan2 climbed +$DELTA_F2 RPM under load"
else echo " [!!] fan2 only +$DELTA_F2 RPM — weak response"; fi
# Lockstep: peak RPMs should match within ~150 RPM.
if [ "$PEAK_DIFF" -le 150 ]; then echo " [OK] fans in lockstep (peak Δ=$PEAK_DIFF RPM)"
else echo " [!!] fans diverged at peak (Δ=$PEAK_DIFF RPM) — one may be obstructed"; fi
# Ramp-down: only meaningful if we reached the cooled steady state.
if [ "$COOL_TIMEOUT" = "1" ]; then
echo " [skip] ramp-down check (CPU never settled below ${COOL_TEMP}°C in ${COOLDOWN_MAX_S}s — try again with no background load)"
else
[ "$END_F1" -lt "$PEAK_F1" ] && echo " [OK] fan1 ramped down ($PEAK_F1 -> $END_F1)" \
|| echo " [!!] fan1 did not ramp down ($PEAK_F1 -> $END_F1)"
[ "$END_F2" -lt "$PEAK_F2" ] && echo " [OK] fan2 ramped down ($PEAK_F2 -> $END_F2)" \
|| echo " [!!] fan2 did not ramp down ($PEAK_F2 -> $END_F2)"
fi
# Thermal recovery: end temp should be lower than peak (using awk for float).
RECOV=$(awk -v p="$PEAK_T" -v e="$END_T" 'BEGIN{print (e<p)?"yes":"no"}')
if [ "$RECOV" = "yes" ]; then echo " [OK] CPU cooled $PEAK_T°C -> $END_T°C"
else echo " [!!] CPU did not cool ($PEAK_T°C -> $END_T°C)"; fi
echo
echo "done."
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment