// Copyright (c) 2026 Storm Dragon // SPDX-License-Identifier: GPL-3.0-or-later package sound // Use progress's pitch mapping with a triangle wave to distinguish indentation // from progress's clipped sine. Cache 0..100 columns before input opens. func indentation_clips() [101]*clip { var clips [101]*clip for level := range clips { clips[level] = progress_tone_shape(float64(level), true) } return clips } // Indentation uses ordinary cue admission, independently of the progress // monitor and its cancellation/coalescing state. Deeper levels use tone 100. func (s *Service) Play_indentation(level int) bool { if s == nil || s.closed.Load() || s.finishing.Load() || level < 0 { return false } item := s.indentationTones[min(level, len(s.indentationTones)-1)] if item == nil { return false } s.pending.Store(item) return true }