我在 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
问题
您的代码至少存在三个问题:
- 您的 i 变量是块本地变量,因此它不会传播到您的块之外。这可能不是一个严重的问题,但它会使调试代码变得更加困难。
- 您正在使用
i = 1
. 在每个循环的顶部明确重置 i 的值
- 该块不会在调用块之间记住 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
我有一些 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
问题
您的代码至少存在三个问题:
- 您的 i 变量是块本地变量,因此它不会传播到您的块之外。这可能不是一个严重的问题,但它会使调试代码变得更加困难。
- 您正在使用
i = 1
. 在每个循环的顶部明确重置 i 的值
- 该块不会在调用块之间记住 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