From d1657e09ab8cc85d6b13d996e8803e79b2f56aef Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Sat, 31 Jan 2026 19:31:33 +0000 Subject: [PATCH] implement strip fader commands --- cmd/strip.go | 200 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 193 insertions(+), 7 deletions(-) diff --git a/cmd/strip.go b/cmd/strip.go index fa6d1d5..c01dabc 100644 --- a/cmd/strip.go +++ b/cmd/strip.go @@ -1,24 +1,22 @@ -/* -LICENSE: https://github.com/onyx-and-iris/xair-cli/blob/main/LICENSE -*/ package cmd import ( - "fmt" + "time" "github.com/spf13/cobra" ) -// stripCmd represents the strip command +// stripCmd represents the strip command. var stripCmd = &cobra.Command{ Use: "strip", Short: "Commands to control individual strips", Long: `Commands to control individual strips of the XAir mixer, including fader level and mute status.`, - Run: func(cmd *cobra.Command, args []string) { - fmt.Println("strip called") + Run: func(cmd *cobra.Command, _ []string) { + cmd.Help() }, } +// stripMuteCmd represents the strip mute command. var stripMuteCmd = &cobra.Command{ Use: "mute", Short: "Get or set the mute status of a strip", @@ -85,8 +83,196 @@ For example: }, } +// stripFaderCmd represents the strip fader command. +var stripFaderCmd = &cobra.Command{ + Use: "fader", + Short: "Get or set the fader level of a strip", + Long: `Get or set the fader level of a specific strip. + +If no level argument is provided, the current fader level is retrieved. +If a level argument (in dB) is provided, the strip fader is set to that level. + +For example: + # Get the current fader level of strip 1 + xair-cli strip fader 1 + + # Set the fader level of strip 1 to -10.0 dB + xair-cli strip fader 1 -10.0 +`, + Run: func(cmd *cobra.Command, args []string) { + client := ClientFromContext(cmd.Context()) + if client == nil { + cmd.PrintErrln("OSC client not found in context") + return + } + + if len(args) < 1 { + cmd.PrintErrln("Please provide a strip number") + return + } + + stripIndex := mustConvToInt(args[0]) + + if len(args) == 1 { + level, err := client.StripFader(stripIndex) + if err != nil { + cmd.PrintErrln("Error getting strip fader level:", err) + return + } + cmd.Printf("Strip %d fader level: %.2f\n", stripIndex, level) + return + } + + if len(args) < 2 { + cmd.PrintErrln("Please provide a fader level in dB") + return + } + + level := mustConvToFloat64(args[1]) + + err := client.SetStripFader(stripIndex, level) + if err != nil { + cmd.PrintErrln("Error setting strip fader level:", err) + return + } + cmd.Printf("Strip %d fader set to %.2f dB\n", stripIndex, level) + }, +} + +// stripFadeOutCmd represents the strip fade out command. +var stripFadeOutCmd = &cobra.Command{ + Use: "fadeout", + Short: "Fade out the strip over a specified duration", + Long: `Fade out the strip over a specified duration in seconds. + +For example: + # Fade out strip 1 over 5 seconds + xair-cli strip fadeout 1 --duration 5.0 +`, + Run: func(cmd *cobra.Command, args []string) { + client := ClientFromContext(cmd.Context()) + if client == nil { + cmd.PrintErrln("OSC client not found in context") + return + } + + if len(args) < 1 { + cmd.PrintErrln("Please provide strip number") + return + } + + stripIndex := mustConvToInt(args[0]) + + duration, err := cmd.Flags().GetFloat64("duration") + if err != nil { + cmd.PrintErrln("Error getting duration flag:", err) + return + } + + target := -90.0 + if len(args) > 1 { + target = mustConvToFloat64(args[1]) + } + + currentFader, err := client.StripFader(stripIndex) + if err != nil { + cmd.PrintErrln("Error getting current strip fader level:", err) + return + } + + totalSteps := float64(currentFader - target) + if totalSteps <= 0 { + cmd.Println("Strip is already at or below target level") + return + } + + stepDelay := time.Duration(duration*1000/totalSteps) * time.Millisecond + + for currentFader > target { + currentFader -= 1.0 + err := client.SetStripFader(stripIndex, currentFader) + if err != nil { + cmd.PrintErrln("Error setting strip fader level:", err) + return + } + time.Sleep(stepDelay) + } + + cmd.Printf("Strip %d faded out to %.2f dB over %.2f seconds\n", stripIndex, target, duration) + }, +} + +// stripFadeInCmd represents the strip fade in command. +var stripFadeInCmd = &cobra.Command{ + Use: "fadein", + Short: "Fade in the strip over a specified duration", + Long: `Fade in the strip over a specified duration in seconds. + +For example: + # Fade in strip 1 over 5 seconds + xair-cli strip fadein 1 --duration 5.0 +`, + Run: func(cmd *cobra.Command, args []string) { + client := ClientFromContext(cmd.Context()) + if client == nil { + cmd.PrintErrln("OSC client not found in context") + return + } + + if len(args) < 1 { + cmd.PrintErrln("Please provide strip number") + return + } + + stripIndex := mustConvToInt(args[0]) + + duration, err := cmd.Flags().GetFloat64("duration") + if err != nil { + cmd.PrintErrln("Error getting duration flag:", err) + return + } + + target := 0.0 + if len(args) > 1 { + target = mustConvToFloat64(args[1]) + } + + currentFader, err := client.StripFader(stripIndex) + if err != nil { + cmd.PrintErrln("Error getting current strip fader level:", err) + return + } + + totalSteps := float64(target - currentFader) + if totalSteps <= 0 { + cmd.Println("Strip is already at or above target level") + return + } + + stepDelay := time.Duration(duration*1000/totalSteps) * time.Millisecond + + for currentFader < target { + currentFader += 1.0 + err := client.SetStripFader(stripIndex, currentFader) + if err != nil { + cmd.PrintErrln("Error setting strip fader level:", err) + return + } + time.Sleep(stepDelay) + } + + cmd.Printf("Strip %d faded in to %.2f dB over %.2f seconds\n", stripIndex, target, duration) + }, +} + func init() { rootCmd.AddCommand(stripCmd) stripCmd.AddCommand(stripMuteCmd) + + stripCmd.AddCommand(stripFaderCmd) + stripCmd.AddCommand(stripFadeOutCmd) + stripFadeOutCmd.Flags().Float64P("duration", "d", 5.0, "Duration of the fade out in seconds") + stripCmd.AddCommand(stripFadeInCmd) + stripFadeInCmd.Flags().Float64P("duration", "d", 5.0, "Duration of the fade in in seconds") }