Lua: ProteaAudio API混淆--如何使用它?

大家好。

很抱歉我是一个非程序员,正在努力学习使用 Lua 编程。

我对 Lua 很感兴趣,因为它确实非常简单,无论是在大小还是语法方面都是如此。

我决定进一步探索这种巴西语言,比如玩具声音——就像我在 Python 和 Ruby 中所做的那样。

所以我找到了这个 ProteaAudio,并尝试播放我从这里下载的软件包中附带的示例脚本。

该软件包附带两个示例脚本:

  1. 名为 example.lua,以播放 ogg 示例文件(也包含在软件包中)。
  2. 另一个用于播放函数生成的声音,名为 scale.lua

第一个脚本在我的 Win 7 和 Ubuntu 12.04 x86 机器上运行得非常好。

但是在 Ubuntu 上运行第二个脚本时出现了错误,并生成了以下消息:

../lua52: scale.lua:13: bad argument #1 to 'soundLoop' (number expected, got nil)

stack traceback:

[C]: in function 'soundLoop'

scale.lua:13: in function 'playNote'

scale.lua:29: in main chunk

[C]: in ?

scale.lua 的完整源代码如下:

-- function creating a sine wave sample:
function sampleSine(freq, duration, sampleRate)
    local data = { }
    for i = 1,duration*sampleRate do
        data[i] = math.sin( (i*freq/sampleRate)*math.pi*2)
    end
    return proAudio.sampleFromMemory(data, sampleRate)
end

-- plays a sample shifted by a number of halftones for a definable period of time
function playNote(sample, pitch, duration, volumeL, volumeR, disparity)
    local scale = 2^(pitch/12)
    local sound = proAudio.soundLoop(sample, volumeL, volumeR, disparity, scale)
    proAudio.sleep(duration)
    proAudio.soundStop(sound)
end

-- create an audio device using default parameters and exit in case of errors
require("proAudioRt")
if not proAudio.create() then os.exit(1) end

-- generate a sample:
local sample = sampleSine(440, 0.5, 88200)

-- play scale (a major):
local duration = 0.5
for i,note in ipairs({ 0, 2, 4, 5, 7, 9, 11, 12 }) do
    playNote(sample, note, duration)
end

-- cleanup
proAudio.destroy()

由于我对这个 ProteaAudio Lua API 感到困惑,我真的不明白为什么会出现这个错误。

请帮忙。

点赞
用户588079
用户588079

这实际上只是一个猜测,但是……

为了向上演奏“大调”音阶(8个音符,跳跃:_全 全_半,_全 全 全_半),原始代码执行以下操作:

local duration = 0.5
for i,note in ipairs({ 0, 2, 4, 5, 7, 9, 11, 12 }) do
    playNote(sample, note, duration)
end

其中 sample 是通过 proAudio.sampleFromMemory 创建的预生成的样本的句柄,由函数 sampleSine 返回,该函数传递了一个计算出的代表440hz正弦波(音符“A4”的音高,高于中间的 C)的“表格”。

因此,在8个步骤(音符)中通过更改(增加)该样本的“音调”(频率)来播放“A大调”音阶。 该音高计算由函数 playNote 完成。

函数 playNote 接受以下参数:

sample、pitch、duration、volumeL、volumeR、disparity

但是它当前 没有接收到 参数:

volumeL、volumeR、disparity (然后将为 nil)。

因此,当函数 playNote 尝试调用:

proAudio.soundLoop(sample, volumeL, volumeR, disparity, scale)

那么调用最终将成为:

proAudio.soundLoop(sample, nil, nil, nil, scale)

其中 sample 传递并且 scale 是刚刚由函数 playNote 根据指定的 note 计算出的该样本的“回放音高” 。

您的错误消息指出:bad argument #1 to 'soundLoop' (number expected, got nil)

**嗯,这似乎符合发生的情况**(假设“错误参数#1”是第二个参数,在这种情况下为 volumeL)。

因此,

您可以 尝试 指定一些 volumeL、volumeR、disparity 的值,例如:

local duration = 0.5
local volumeL = 1.0
local volumeR = 1.0
local disparity = 0.0
for i,note in ipairs({ 0, 2, 4, 5, 7, 9, 11, 12 }) do
    playNote(sample, note, duration, volumeL, volumeR, disparity)
end

proteaAudio 文档 中可以阅读到 soundLoop 的参数:

sample    -            以前 load() 调用返回的样本句柄
volumeL   - (可选)      左声道音量
volumeR   - (可选)      右声道音量
disparity - (可选)      左右声道之间的时间差,以秒为单位。使用负值为左声道指定延迟,使用正值为右声道指定延迟。
pitch     - (可选)      回放的音高因子。 0.5 对应于原始样本下方一个八度,2.0 对应于上方一个八度。

如果那样就可以解决问题,那么在 Ubuntu 上这些参数可能并不那么可选。

希望这可以帮到您!

2013-04-12 23:11:31