Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

slab/menuband: octave reads "4" with hint label, synth-start log

- Octave label shows the absolute pitch number (4 by default, since the
menubar piano starts at C4) instead of the +N/-N relative shift. A
tiny "octave" hint label sits to the right so the number reads as
scientific pitch notation at a glance.
- One-line NSLog after engine.start so it's visible in the launchd
log whether the GS DLS bank actually loaded (status=0 == noErr).
- DMG cache-bust → ?v=59b8d6b.

+30 -16
+28 -15
slab/menuband/Sources/MenuBand/MenuBandPopover.swift
··· 102 102 equalToConstant: InstrumentListView.preferredWidth + 16 103 103 ).isActive = true 104 104 105 - // Top control row: octave + MIDI hugging the right. Brand title 106 - // moved into the About section below — fewer wasted rows up top. 105 + // Top control row: octave hugs the left, MIDI hugs the right. Brand 106 + // title moved into the About section below — fewer wasted rows up top. 107 107 let titleRow = NSStackView() 108 108 titleRow.orientation = .horizontal 109 109 titleRow.alignment = .centerY ··· 112 112 113 113 let titleSpacer = NSView() 114 114 titleSpacer.setContentHuggingPriority(.defaultLow, for: .horizontal) 115 - titleRow.addArrangedSubview(titleSpacer) 115 + // Spacer is added BETWEEN the octave trio and the MIDI pair below 116 + // so the octave widget pins to the row's leading edge and MIDI 117 + // floats to the trailing edge — no longer center-clustered. 116 118 117 119 // Compact octave: large monospaced number, then a tight pair of 118 120 // chevron arrows to its right. NSStepper kept invisibly as the 119 121 // value model so the rest of the controller's API doesn't change; 120 122 // the visible buttons just nudge its `integerValue`. 121 - octaveLabel = NSTextField(labelWithString: "+0") 123 + octaveLabel = NSTextField(labelWithString: "4") 122 124 // Fully monospaced so "+", "-", and digits all carry the same 123 125 // advance — value flips don't slide left or right between the 124 126 // arrows. No fixed width — intrinsic content width hugs the text ··· 162 164 rightArrow.target = self 163 165 rightArrow.action = #selector(octaveUp) 164 166 165 - // Arrows flank the number — left arrow, then big number, then 166 - // right arrow. Tight 4 px gap on each side so the trio reads as 167 - // a single widget instead of three separate buttons. 167 + // Octave trio first — left arrow, big number, right arrow — pinned 168 + // to the row's leading edge with a tight 4 px gap on each side so 169 + // the trio reads as a single widget instead of three buttons. A tiny 170 + // "octave" hint label sits to the right of the rightArrow so the 171 + // number reads as scientific pitch notation (C4, C5, …) without 172 + // taking much room. 173 + let octaveHint = NSTextField(labelWithString: "octave") 174 + octaveHint.font = NSFont.systemFont(ofSize: 9, weight: .regular) 175 + octaveHint.textColor = .tertiaryLabelColor 176 + 168 177 titleRow.addArrangedSubview(leftArrow) 169 178 titleRow.setCustomSpacing(4, after: leftArrow) 170 179 titleRow.addArrangedSubview(octaveLabel) 171 180 titleRow.setCustomSpacing(4, after: octaveLabel) 172 181 titleRow.addArrangedSubview(rightArrow) 173 182 titleRow.addArrangedSubview(octaveStepper) // hidden, here for layout-time only 183 + titleRow.setCustomSpacing(3, after: rightArrow) 184 + titleRow.addArrangedSubview(octaveHint) 185 + 186 + // Spacer lives in the middle so the octave widget pins LEFT and 187 + // the MIDI pair pins RIGHT. 188 + titleRow.addArrangedSubview(titleSpacer) 174 189 175 190 // MIDI toggle — tucked into the title row instead of its own panel. 176 - // Tiny label + switch, no spacer between (sits flush right of the 177 - // octave arrows so the row stays compact). 178 191 midiSwitch = NSSwitch() 179 192 midiSwitch.target = self 180 193 midiSwitch.action = #selector(midiSwitchToggled(_:)) 181 194 midiInlineLabel = NSTextField(labelWithString: "MIDI") 182 195 midiInlineLabel.font = NSFont.systemFont(ofSize: 10, weight: .semibold) 183 196 midiInlineLabel.textColor = .secondaryLabelColor 184 - titleRow.setCustomSpacing(12, after: rightArrow) 185 197 titleRow.addArrangedSubview(midiInlineLabel) 198 + titleRow.setCustomSpacing(4, after: midiInlineLabel) 186 199 titleRow.addArrangedSubview(midiSwitch) 187 200 188 201 stack.addArrangedSubview(titleRow) ··· 630 643 } 631 644 632 645 private func updateOctaveLabel(_ shift: Int) { 633 - let s: String 634 - if shift == 0 { s = "0" } 635 - else if shift > 0 { s = "+\(shift)" } 636 - else { s = "\(shift)" } 637 - octaveLabel.stringValue = s 646 + // Piano starts at C4 (MIDI 60), so an octave shift of 0 shows "4". 647 + // Show the absolute octave number — easier to read than ±N for users 648 + // who think in scientific pitch notation. 649 + let octave = 4 + shift 650 + octaveLabel.stringValue = "\(octave)" 638 651 } 639 652 640 653 // MARK: - Actions
+1
slab/menuband/Sources/MenuBand/MenuBandSynth.swift
··· 101 101 NSLog("MenuBand synth engine start failed: \(error)") 102 102 return 103 103 } 104 + NSLog("MenuBand: synth engine started — bank load status=\(bankStatus), MIDISynth ready") 104 105 105 106 configureChannels() 106 107 primeForLowLatency()
+1 -1
system/public/menuband/index.html
··· 879 879 <p class="tagline">Built-in macOS instruments, in the menu bar.</p> 880 880 881 881 <div class="button-row"> 882 - <a class="aqua" href="https://assets.aesthetic.computer/menuband/Menu-Band-0.1.dmg?v=bd296cf" download> 882 + <a class="aqua" href="https://assets.aesthetic.computer/menuband/Menu-Band-0.1.dmg?v=59b8d6b" download> 883 883 Download 884 884 <small>0.1 · Apple Silicon · 1.1 MB</small> 885 885 </a>