【问题标题】:Lua: ProteaAudio API confuse -- How to use it?Lua:ProteaAudio API 混淆——如何使用?
【发布时间】:2013-04-12 20:40:10
【问题描述】:

大家好。

抱歉我的菜鸟问题,因为我只是一个试图学习使用 Lua 编程的非程序员。

Lua 非常吸引我,因为它确实非常简单,无论是大小还是语法。

我决定进一步尝试使用这种巴西出生的语言,比如玩声音——就像我在 Python 和 Ruby 中所做的那样。

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

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

  1. 首先命名为 example.lua 来播放 ogg 示例文件(也包含在包中)
  2. 另一个播放函数生成的声音名为scale.lua

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

但第二个脚本只能在 Windows 上运行,当我尝试在 Ubuntu 上运行时出现错误,生成以下消息:

../lua52: scale.lua:13: 'soundLoop' 的参数 #1 错误(预期数字,结果为零)

堆栈回溯:

[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 感到困惑,我真的不明白为什么会出现这个错误。

请帮忙。

【问题讨论】:

  • for循环之前试试这个:print( sample, type(sample) )
  • 在输入我的答案时,我忘了提到我冒昧地将scale.lua 的完整原始源代码添加到您的问题中,以供将来参考并尝试获得更多关注回答你的好问题。

标签: api audio lua


【解决方案1】:

这其实只是猜测,但是……

要向上演奏“大”音阶(8 个音符,跳跃:full full half, full full full half)原始代码:

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
它当前不接收参数:
@987654329 @(然后将是 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)
嗯,这似乎与正在发生的事情一致(假设 'bad argument #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 上可能不是那么可选。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2011-03-25
    • 2016-03-23
    • 1970-01-01
    相关资源
    最近更新 更多