FRY33K6EGWLU3F5NJJ66AT5RBV6OEOWSDKY3JH2CPKKGPAHOMM6AC 34FVOOTLYPUGWW52DALTVLTMBS7SMM4KB2G2G4CX5CDGBOEYQQSAC 5KIKDA72HM6JFIPKOWGLM2EO7D5PTSK7WEVYV3YZWGMG3M34PJXQC U6JEEU5O477ZOJ5UMRMOJSGPEJEU6Q7KMPKUSDF56CYVUJWL7QBQC DBOROCRFD6A5SJBMFYFEJI5S5M77X4EFEK6KDQWA5QDMQJKIHRWQC 3XZAHT6PTML33YSBVF5OSL7KLCRARTHRYPT3N7GUYJKSZKWHBIDQC ZFMOUTHEMHYYEAGXRQ3L427FVZPNBC7CX6QATVXU2KPDJOVEH2EQC EW7VBNMGWFBC73ZUDLB4LIK2HWFKA74ZUTUDG4J575ZQHEFHW4UQC GQNMVJQBC6DRV5XGK3K5L7YWG2GJUXR7EQE3OHNW72XK6BFY3AHQC // segmentChangeCmd returns the appropriate command after a segment change.// For sixel: sequence clear screen then write sixel (runs after View renders).// For kitty: just clear screen (kitty images are managed in View).func (m Model) segmentChangeCmd() tea.Cmd {if m.protocol() == utils.ProtocolSixel {return tea.Sequence(tea.ClearScreen, sixelImageCmd(m.state))}return tea.ClearScreen}
// Derive WAV path and load samples
img := generateSpectrogramImage(m.state, dataPath, seg)if img == nil {b.WriteString("[error generating spectrogram]")return}utils.WriteKittyImage(img, b)}// generateSpectrogramImage creates a resized spectrogram image from a segment.func generateSpectrogramImage(state *tools.ClassifyState, dataPath string, seg *utils.Segment) image.Image {
resized := utils.ResizeImage(img, imgSize, imgSize)
return utils.ResizeImage(img, imgSize, imgSize)}// sixelImageCmd returns a tea.Cmd that generates and writes a sixel image// directly to the terminal, bypassing BubbleTea's renderer.func sixelImageCmd(state *tools.ClassifyState) tea.Cmd {return func() tea.Msg {df := state.CurrentFile()seg := state.CurrentSegment()if df == nil || seg == nil {return nil}
// Output via terminal graphics protocol (images cleared at start of View)utils.WriteImage(resized, b, m.protocol())
img := generateSpectrogramImage(state, df.FilePath, seg)if img == nil {return nil}fmt.Fprint(os.Stdout, "\r\n\r\n")utils.WriteSixelImage(img, os.Stdout)return nil}