Lua: ProteaAudio API混淆--如何使用它?
2013-4-12 22:23:22
收藏:0
阅读:151
评论:1
大家好。
很抱歉我是一个非程序员,正在努力学习使用 Lua 编程。
我对 Lua 很感兴趣,因为它确实非常简单,无论是在大小还是语法方面都是如此。
我决定进一步探索这种巴西语言,比如玩具声音——就像我在 Python 和 Ruby 中所做的那样。
所以我找到了这个 ProteaAudio,并尝试播放我从这里下载的软件包中附带的示例脚本。
该软件包附带两个示例脚本:
- 名为 example.lua,以播放 ogg 示例文件(也包含在软件包中)。
- 另一个用于播放函数生成的声音,名为 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 感到困惑,我真的不明白为什么会出现这个错误。
请帮忙。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
这实际上只是一个猜测,但是……
为了向上演奏“大调”音阶(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 上这些参数可能并不那么可选。
希望这可以帮到您!