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

时间:2013-04-12 20:40:11

标签: api audio lua

大家好。

对不起我的noob问题因为我只是一个非程序员试图学习用Lua编程。

我很喜欢Lua,因为它的大小和语法都非常简单。

我决定用这种巴西出生的语言进一步探索实验,就像在声音中一样 - 就像我在Python和Ruby中所做的那样。

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

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

  1. 首先命名为 example.lua 以播放ogg示例文件(也包含在包中)
  2. 和另一个播放函数生成的声音名为 scale.lua
  3. 第一个脚本在我的Win 7和Ubuntu 12.04 x86机器上运行得很好。

    但第二个脚本只在Windows上运行,当我尝试在Ubuntu上运行它时出错,生成此消息:

      

    ../ lua52:scale.lua:13:错误的参数#1到'soundLoop'(数字预期,没有了)

         

    堆栈追溯:

         

    [C]:在函数'soundLoop'中

         

    scale.lua:13:在函数'playNote'中

         

    scale.lua:29:在主要块中

         

    [C]:在?

    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感到困惑,我真的无法理解为什么会出现这个错误。

    请帮忙。

1 个答案:

答案 0 :(得分:0)

这实际上只是猜测,但......

要向上播放“主要”音阶(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正弦的计算“表” wave(音符'A4'的音高 - 音高,第一个高于'C'') 因此通过改变(增加)该样本的“pich”(频率)来播放“A大规模”(以8个步骤=音符)。该音调计算由函数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 documentation可以阅读soundLoop的论点:

sample    -            A sample handle returned by a previous load() call
volumeL   - (optional) Left volume
volumeR   - (optional) Right volume
disparity - (optional) Time difference between left and right channel in seconds. 
                       Use negative values to specify a delay for the left 
                       channel, positive for the right.
pitch     - (optional) Pitch factor for playback. 0.5 corresponds to one octave 
                       below, 2.0 to one above the original sample.

如果应该这样做,那么参数在Ubuntu上可能不是那么可选。

希望这有帮助!