宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)

电子技术应用ChinaAET昨天
以下文章来源于得捷电子DigiKey , 作者EVANBROWNING
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片
得捷电子DigiKey
得捷电子Digi-Key,来自美国的专业电子元器件分销商 。 1000多家知名厂商原厂授权 , 180多万种现货库存 , 当天下单 , 即日发货 。 人民币业务所有价格包含关税和增值税 , 特快专递 , 免运费送货上门 。
不久之前 , 我们美国的工程师在新春视频里 , 演示了运用Adafruit的Neotrellis用作音板(Soundboard) , 并编程播放新年贺岁音乐以庆祝农历新年的demo 。
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片
工程师EvanBrowning在Maker.io发表过「如何运用AdafruitNeotrellis作音板」(https://www.digikey.com/en/maker/projects/how-to-use-adafruits-neotrellis-as-a-soundboard/6d5e489c12a348f893add1e86ccd1d1a)的教学演示 , 我们中国工程师对此做了简单的翻译供大家快速入门 。
-------------------------------
新春视频里的3D打印龙的档案 , 可到Digi-Key官方微信相关推文下载 。
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片
入门
阅读过NeoTrellis的文档之后 , 我决定采用CircuitPython语言和Mu编辑器来进行编程 , 启动了此项目 。
运行程序:
1.安装Mu開源編輯器 。 这款编辑器支持将代码写入NeoTrellis , 并轻松地与之进行通信 。
2.下载适用于NeoTrellis的最新版CircuitPython并将此.uf2文件拖到桌面 。
3.将NeoTrellis连接到你的电脑 。 此时 , 电脑的文件系统中会显示一个名为CIRCUITPY的新外部驱动器 , 如下所示 。 如果未显示CIRCUITPY , 请参阅下一步 。
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片
4.如已显示CIRCUITPY , 请跳过此步骤 。 使用钢笔或螺丝刀等较细物品双击NeoTrellis底部的重置按钮 。 该按钮位于NeoTrellis下方的一个小洞内 , 如下图所示 。 此时 , 电脑中应显示一个名为“TREM4BOOT”的驱动器 。 将.uf2文件(步骤2中)拖到此驱动器中 。 这时 , TRELM4BOOT会消失 , 而CIRCUITPY会显示出来 。
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片
5.打开Mu 。 屏幕上会出现一个弹出窗口 , 询问你想要选择何种模式 。 选择“AdafruitCircuitPython”并点击“OK” 。 如未出现此弹窗 , 点击左上角的“Mode” , 然后选择“AdafruitCircuitPython” 。
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片
6.将下面的示例代码复制并粘贴到Mu中 。 所有以灰色突出显示的文本均为注释 。
CopyCode
importtime#libraryforthetimefunctionwhileTrue:#mainloopprint(''HelloWorld!'')#say“HelloWorld!”time.sleep(1)#delayforreadingserialoutput
7.双击左上角附近的“untitled*”选项卡 。 这时将弹出另存为屏幕 。
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片
8.将文件以文件名“code.py”另存到CIRCUITPY中 。 如果电脑显示此文件已在CIRCUITPY中 , 点击“Replace” 。 这样可告知NeoTrellis如何运行你的程序 , 即 , 每次在NeoTrellis上运行不同的程序时 , 都将替换code.py 。
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片
9.点击窗口顶部的“Serial” , 可打开串口监视器 , 以查看程序是否在工作 。 这时屏幕底部将会显示一串“HelloWorld!”语句 。
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片
注意事项:
由于文件“code.py”用于指示如何在NeoTrellis上运行程序 , 因此如果你希望保存多个程序的副本 , 可以将它们重命名并保存到你的电脑上 。
如果出现问题 , 请重置NeoTrellis 。 这时你可能必须将.uf2文件拖回到TREM4BOOT中 。
默认鼓机
此示例程序将有助于确保你能够听到NeoTrellis的音频 。
下载适用于鼓机例程文件(neotrellis_m4_default_files)并解压缩 。
使用3.5mm耳机插孔将NeoTrellis连接到扬声器或带有音量调节的耳机 。 NeoTrellis没有音量调节功能 , 因此请先将音量调低 。
将NeoTrellis连接到电脑 , 并将鼓机文件拖到CIRCUITPY驱动器中 。 如果CIRCUITPY未显示 , 请参阅上文中“运行程序”一节 。
在启动灯熄灭后 , 每隔几秒就会有一条像素白线在板上扫过 。 触摸某个按钮可使其恒亮 , 再次触摸可将其熄灭 。 当白线遇到某个点亮的按钮时 , 将播放该按钮所对应的鼓声 。 每种颜色都代表着不同的声音 。
*也可以点以下连结下载鼓机文件从百度下载
提取码:2i4p
安装库
CircuitPython拥有一些非常有用的库 , 因此建议安装其中的一部分 。
【宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)】1.查看CIRCUITPY是否拥有名为“lib”的文件夹 。 如果没有 , 请创建一个新文件夹 , 将其命名为lib , 并拖到CIRCUITPY中 。 此文件夹就是保存库的位置 。
2.下载AdafruitCircuitPythonTrellisM4库 。 依次点击“CloneorDownload”、“DownloadZip”即可下载文件 。 双击文件以解压缩 。 这时 , 系统将打开名为“adafruit_circuitpython_trellism4-master”的文件夹 。 将此文件夹拖到lib文件夹中 。 该库专用于NeoTrellis 。
3.下载最新的CircuitPythonLibraryBundle 。 点击“adafruit-circuitpython-bundle-4.x-mpy-20190606.zip”以下载文件 。 双击文件以解压缩 。 这时 , 系统将显示一个名为“adafruit-circuitpython-bundle-4.x-mpy-20190606”的文件夹 。 打开此文件夹 , 然后打开其中的“lib”文件夹 。 将此“lib”中的内容拖到CIRCUITPY的“lib”文件夹中 。
点亮按钮
此针对NeoTrellis库的文档中包含以下函数的信息 , 这些函数可用于处理按下按钮和点亮板等操作 。
pressed_keys——当前按下的按钮坐标的元组列表 。
pixels——在NeoTrellisM4上提供NeoPixels的二维网格表示 。
pixels.fill——将所有NeoPixels着色为指定颜色 。
pixels.brightness——像素的整体亮度 。 这必须是介于0和1之间的数字 , 用于表示百分比 , 例如0.3表示30% 。
pixels.width——NeoPixel网格的宽度 。 当旋转为0或180时 , 宽度为8 。 当旋转为90或270时 , 宽度为4 。
pixels.height——NeoPixel网格的高度 。 当旋转为0或180时 , 高度为4 。 当旋转为90或270时 , 高度为8 。
利用函数pixels和pixels.brightness , 我通过定义4个按钮的位置和颜色开始点亮按钮 。 代码如下所示 。
CopyCode
importtimeimportadafruit_trellism4#importNeoTrellisLibrarytrellis=adafruit_trellism4.TrellisM4Express()trellis.pixels.brightness=(0.2)buttons=(0,0),#button1(7,0),#button2(0,3),#button3(7,3)#button4colors=(179,0,255),#button1(0,255,0),#button2(0,0,255),#button3(255,255,0)#button4defColorButtons():#functiontosetbuttoncolorsforiinrange(len(buttons)):trellis.pixelsbuttons[i]=colorsiwhileTrue:#mainloopColorButtons()
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片
上图中有四个按钮是彩色的
接下来 , 我添加了一些代码用以检测按钮何时被按下 , 这只需查看pressed_keys函数是否包含信息即可 。 如果没有按下任何按键 , 则pressed_keys将为空 , 因而变量pressed为False 。 当按键被按下时 , pressed将为True , 而NeoTrellis将在串口监视器中表示“某个按钮正被按下” 。
CopyCode
whileTrue:#mainlooppressed=list(trellis.pressed_keys)ifpressed:print(''abuttonisbeingpressed'')else:print(''abuttonisnotbeingpressed'')ColorButtons()time.sleep(0.1)#delayforreadingserialmonitor
接着 , 我添加了一个函数 , 用于检查按下的是哪个按钮 。 利用循环 , 该函数可以测试指定的按钮坐标是否与任何定义的按钮坐标相匹配 。 如果未找到该按钮 , 则该按钮将返回False 。 该循环在主循环之上 。
CopyCode
defLocation(val):found=Falseforiinrange(len(buttons)):ifval==buttonsi:found=i+1returnfound
以下代码执行的是location函数 , 使用变量place来跟踪按下的是哪个按钮 。
CopyCode
whileTrue:#mainwhilelooppressed=list(trellis.pressed_keys)ifpressed:print(''abuttonisbeingpressed'')place=Location(pressed0)ifplace:print(''button'',place,''isbeingpressed'')trellis.pixelsbuttons[place-1]=(255,255,255)else:print(''abuttonisnotbeingpressed'')ColorButtons()time.sleep(0.1)#delayforreadingserialmonitor
接下来 , 我添加了if语句 , 用以查看按下的按钮是否为已定义用于播放音频的按钮之一 。 如果是 , 代码将根据“ifvalid:”尝试播放音频 。
CopyCode
valid=FalsewhileTrue:#mainlooppressed=list(trellis.pressed_keys)ifpressed:place=Location(pressed0)ifplace:print(''button'',place,''isbeingpressed'')trellis.pixelsbuttons[place-1]=(255,255,255)valid=Trueelse:print(''aninvalidbuttonisbeingpressed'')valid=Falseelse:print(''abuttonisnotbeingpressed'')valid=FalseColorButtons()ifvalid:#playtheassociatedaudioforthepushedbuttonpasstime.sleep(0.1)#delayforreadingserialmonitor
音频
对于此程序的音频部分 , 我依然借用了鼓机的示例 , 通过重命名示例中使用的VOICES数组来实现各按钮的音频播放 , 不过其余代码是直接复制的 。 下面是位于主循环之上的音频设置 。
CopyCode
importboardimportbusioimportaudioiofromwave_parsingimportparse_wav#beginningofaudiosetupVOICES=''Button_1.wav'',#button1''Button_2.wav'',#button2''Button_3.wav'',#button3''Button_4.wav''#button4#Parsethefirstfiletofigureoutwhatformatitsinwave_format=parse_wav(VOICES0)print(wave_format)#Audioplaybackobject-we'llgowitheithermonoorstereodependingon#whatweseeinthefirstfileifwave_format'channels'==1:audio=audioio.AudioOut(board.A1)elifwave_format'channels'==2:audio=audioio.AudioOut(board.A1,right_channel=board.A0)else:raiseRuntimeError(''Mustbemonoorstereowaves!'')mixer=audioio.Mixer(voice_count=len(VOICES),sample_rate=wave_format'sample_rate',channel_count=wave_format'channels',bits_per_sample=16,samples_signed=True)audio.play(mixer)samples=
接着 , 我在为各按钮播放音频的主循环中添加了代码 。 这与鼓机示例中的代码非常相似 。
CopyCode
whileTrue:#mainlooppressed=list(trellis.pressed_keys)ifpressed:place=Location(pressed0)ifplace:print(''button'',place,''isbeingpressed'')trellis.pixelsbuttons[place-1]=(255,255,255)valid=Trueelse:print(''aninvalidbuttonisbeingpressed'')valid=Falseelse:print(''abuttonisnotbeingpressed'')valid=FalseColorButtons()ifvalid:print(''Valid'')#playthesoundwave_file=open(VOICESplace-1,''rb'')sample=audioio.WaveFile(wave_file)mixer.play(sample,voice=0)whilemixer.playing:print(''PlayingSound'')time.sleep(0.1)ColorButtons()time.sleep(0.1)
最后 , 我添加了一个特性 , 即“如果在先前所按按钮的音频播放结束之前按下了不同的按钮 , 则会更改正在播放的音频” 。
CopyCode
ifvalid:print(''Valid'')#playthesoundwave_file=open(VOICESplace-1,''rb'')sample=audioio.WaveFile(wave_file)mixer.play(sample,voice=0)whilemixer.playing:print(''PlayingSound'')time.sleep(0.1)#checktoseeifadifferentbuttonwaspressedpressed=list(trellis.pressed_keys)ifpressed:new_place=Location(pressed0)if(new_place!=place)or(new_place==False):print(''DifferentButtonPressed'')breakColorButtons()
最终代码
以下为完整的程序 。
CopyCode
importtimeimportadafruit_trellism4#importNeoTrellisLibraryimportboardimportbusioimportaudioiofromwave_parsingimportparse_wavtrellis=adafruit_trellism4.TrellisM4Express()#######Changethecodebelow#######trellis.pixels.brightness=(0.2)buttons=(0,0),#button1(7,0),#button2(0,3),#button3(7,3)#button4colors=(179,0,255),#button1(0,255,0),#button2(0,0,255),#button3(255,255,0)#button4#beginingofaudiosetupVOICES=''Button_1.wav'',#button1''Button_2.wav'',#button2''Button_3.wav'',#button3''Button_4.wav''#button4#######Changethecodeabove########Parsethefirstfiletofigureoutwhatformatitisinwave_format=parse_wav(VOICES0)
print(wave_format)
#Audioplaybackobject-we'llgowitheithermonoor
stereodependingon
#whatweseeinthefirstfileifwave_format'channels'==1:audio=audioio.AudioOut(board.A1)elifwave_format'channels'==2:
audio=audioio.AudioOut(board.A1,
right_channel=board.A0)
else:raiseRuntimeError(''Mustbemonoorstereowaves!'')
mixer=audioio.Mixer(voice_count=len(VOICES),
sample_rate=wave_format'sample_rate',
bits_per_sample=16,samples_signed=True)audio.play(mixer)samples=defColorButtons():#functiontosetbuttoncolorsforiinrange(len(buttons)):trellis.pixelsbuttons[i]=colorsidefLocation(val):found=Falseforiinrange(len(buttons)):ifval==buttonsi:found=i+1returnfoundvalid=FalsewhileTrue:#mainlooppressed=list(trellis.pressed_keys)ifpressed:place=Location(pressed0)ifplace:print(''button'',place,''isbeingpressed'')trellis.pixelsbuttons[place-1]=(255,255,255)valid=Trueelse:print(''aninvalidbuttonisbeingpressed'')valid=Falseelse:print(''abuttonisnotbeingpressed'')valid=FalseColorButtons()ifvalid:print(''Valid'')#playthesoundwave_file=open(VOICESplace-1,''rb'')sample=audioio.WaveFile(wave_file)mixer.play(sample,voice=0)whilemixer.playing:print(''PlayingSound'')time.sleep(0.1)#checktoseeifadifferentbuttonwaspressedpressed=list(trellis.pressed_keys)ifpressed:new_place=Location(pressed0)if(new_place!=place)or(new_place==False):print(''DifferentButtonPressed'')break#exitthewhiletoendaudioColorButtons()time.sleep(0.1)
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片
虽然有些难以看清 , 但上图显示右上角的按钮是白色的 , 表示当前正在播放该按钮的音频 。
创建音频文件
要在NeoTrellis上播放 , 音频文件必须是以22,050Hz采样的16位PCMWAV文件 , 并且必须全部为立体声或单声道 。
一种获取和转换音频文件的方法是使用一款名为Audacity的开源程序 。 你可以使用现有的音频文件(例如用智能手机录制的音频) , 也可以直接在Audacity上录制 。
1.安装Audacity 。
2.如果电脑上已有可以转换的音频 , 请跳过此部分 。 如果没有 , 也可以直接在Audacity上录制 。
a.先打开Audacity 。 点击下图所示的录制按钮 , 即可打开新项目 。
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片
b.现在你可以录下自己说的话 。 完成后 , 点击停止按钮 。
宅家的工程师真厉害!DIY音板,自嗨玩混音~(内附教程)
文章图片


    推荐阅读