我在 sonic pi 中的音量变量没有改变 - 为什么?

My variable for the volume in sonic pi is not changing - why?

我有一些 sonic pi 代码,它应该做一个旋律 8 次,每次都播放得更柔和。但是,它没有关注变量。我做错了吗?

8.times do
  i = 1
  play 50, amp: 0.1 * i
  sleep 0.25
  play 55, amp: 0.2 * i
  sleep 0.25
  play 57, amp: 0.4 * i
  sleep 0.25
  play 62, amp: i
  i = i - 0.125
end

问题

您的代码至少存在三个问题:

  1. 您的 i 变量是块本地变量,因此它不会传播到您的块之外。这可能不是一个严重的问题,但它会使调试代码变得更加困难。
  2. 您正在使用 i = 1.
  3. 在每个循环的顶部明确重置 i 的值
  4. 该块不会在调用块之间记住 i 的值,因此将 i ||= 1.0 放在块的顶部也不起作用因为 i 在每个循环开始时总是 nil。

考虑现有代码的这个最小示例:

8.times { i = 1; i -= 0.125 }
i # NameError (undefined local variable or method `i' for main:Object)

即使您在块内反省 i,您也会发现它永远不会随着当前逻辑递减。

解决方案

解决问题的最简单方法是在块外设置 i 的初始值。例如:

i = 1.0

8.times do
  i -= 0.125
  p i
end

i
#=> 0.0

Kernel#p语句,可以看到倒数的数字:

0.875
0.75
0.625
0.5
0.375
0.25
0.125
0.0

您还可以看到您的变量现在可以在块外访问,并且在块退出后访问它时不再 returns NameError。

i
#=> 0.0