func Main(ctx sound.Context, channels ...chan float64) { flag.Parse() runtime.GOMAXPROCS(NumThreads) // Make a copy of the argument array before we modify it. channels2 := make([]chan float64, len(channels)) copy(channels2, channels) channels = channels2 // Measure the duration of the first channel var durationStream chan float64 channels[0], durationStream = ctx.Fork2(channels[0]) durationChan := make(chan time.Duration, 1) go func() { durationChan <- ctx.Duration(durationStream) }() so := getOutput(ctx) // Write the output startTime := time.Now() err := so.Write(ctx.SampleRate, channels) endTime := time.Now() if err != nil { fmt.Printf("Error: %s\n", err.Error()) } outSecs := float64(<-durationChan) / float64(time.Second) realSecs := float64(endTime.Sub(startTime)) / float64(time.Second) fmt.Printf("Generated %.3f seconds of audio in %.3f seconds (ratio %.3f).\n", outSecs, realSecs, outSecs/realSecs) }