コード例 #1
0
ファイル: bpm.go プロジェクト: pombredanne/rand
func comb(b audio.Buffer, delay int) (avg, n float64) {
	length := b.Len()
	var (
		i    int
		done int
	)
	for i = length; (i - delay) > 0; i-- {
		delayed := i - delay
		if delayed < 0 {
			break
		}
		done++
		avg += (float64(b.At(delayed)) + 1.0) / 2.0
	}
	if done == 0 {
		//fmt.Println(avg, done, avg / float64(done))
		return 0, 0
	}
	return avg, float64(done)
}
コード例 #2
0
ファイル: bpm.go プロジェクト: pombredanne/rand
func Chunk(b audio.Buffer, combSize, combDelay int) (bpm float64) {
	if combDelay >= combSize {
		panic("combDelay >= combSize")
	}

	length := b.Len()
	low := 1000.0
	high := -1000.0
	avg := 0.0
	for i := 0; i < length; i++ {
		end := i + combSize
		if end > length {
			end = length
		}
		combed, _ := comb(b.Slice(i, end), combDelay)
		if combed < low {
			low = combed
		}
		if combed > high {
			high = combed
		}
		avg += combed
	}
	avg = avg / float64(length)
	diff := high - avg
	fmt.Println("low", low, "high", high, "diff", diff, "avg", avg)

	for i := 0; i < length; i++ {
		end := i + combSize
		if end > length {
			end = length
		}
		combed, _ := comb(b.Slice(i, end), combDelay)
		if combed > (high - diff*0.007) {
			bpm++
		}
	}
	fmt.Println("bpm", bpm)
	return
}