亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

带 3D 打印机的最小 MIDI 鼓组

组件和用品

Arduino UNO
× 1
Adafruit 标准 LCD - 16x2 蓝底白字
× 1
SparkFun Piezo
× 1
Adafruit 力敏电阻 (FSR)
× 1
电阻 10k ohm
× 1
电阻 1M ohm
× 1
SparkFun 齐纳二极管 - 5.1V 1W
× 1
SparkFun 按钮开关 12mm
× 1
滑动开关
× 1
TRS 套接字
× 1
USB-A 转 B 线
× 1
Apple 闪电转 USB 相机转换器
× 1

必要的工具和机器

3D 打印机(通用)
激光切割机(通用)
没必要,额外
烙铁(通用)
圆刀

应用和在线服务

Arduino IDE

关于这个项目

嗨。

这是使用 arduino UNO 的最小架子鼓。

首先,请检查此说明页面。

https://blog.arduino.cc/2017/01/19/a-3d-printed-e-drum-pad/

自从我开始做这个,我就被压电和电子鼓迷住了。

我着迷于一种非常简单的电子鼓机制和称为 MIDI 的伟大发明。

换句话说,光是做垫子我是不能满足的。

这个架子鼓大致分为两个制作。

1.用3d打印机和厚纸制作的垫子。

2.使用arduino UNO触发midi转换器。

“1”的pad发出的信号,经过“2”的arduino处理,转换成MIDI信号。并且MIDI信号从arduino传输到iPhone、笔记本电脑等设备,声音就出来了。

除了智能手机或 PC 之外,您不需要准备电源。

你需要什么

工具

・3D打印机

・激光切割机(额外)

・六角扳手

・切刀

・圆刀

・烙铁

切管机

・司机钻

・钻头9mm / 10mm

材料

・1mm厚纸

・PLA灯丝

・海绵泡沫板 5mm / 10mm

・MDF 2.5mm / 5.5mm(额外)

・M6 - 70mm 螺栓和螺母

・M6 - 50mm 螺栓和螺母

・M3 - 10mm 螺栓和螺母

・M3 - 15mm 螺栓和螺母

・M3 - 25mm 螺栓和螺母

・M2螺丝

・13mm直径不锈钢管

鼓硬件

・网头10寸/8寸

・军鼓架(什么都行。我用的是YAMAHA SS662。)

・踩镲架(什么都行。我用的是YAMAHA HS650A)

・脚踏板(什么都行。我用的是YAMAHA FP7210A)

・鼓棒

第一步:3D打印

所有数据都在 Thingiverse 和 GitHub 上。

轮辋请使用 Ver.2。

我用 20% 的填充量打印了零件。层厚为0.3 mm。

此外,您可以使用激光切割机制作垫子。

https://github.com/RyoKosaka/drums/tree/master/vector

第 2 步:组装

使用M3-10mm螺栓和螺母将零件连接在一起。

使用 M3-15 mm 或 M3-25 mm 螺栓用于中心部分,将底部相互固定。

第 3 步:制作外壳

首先,外壳的高度为55毫米。

请制作三个宽度为 55 毫米的带子。

长度略长于覆盖垫的长度。

由于底部有间隙,请尝试将一根带子插入该间隙。

剪下带子,使其成为完美的圆形长度。

重复此操作 3 次并使用粘合剂覆盖。

待壳干后,将网头固定好,在插座上打一个直径为9mm的孔。

您可以使用蝶形螺母,但我也制作了即使使用普通螺母也可以拧紧的调音键,因此请务必使用。

用于固定网头,请使用 M6-70 mm 螺栓。

一旦你打了一个洞,再次取下网头以放置压电

第 4 步:连接压电陶瓷

圈套

在军鼓的情况下,使用两个压电,如图所示。

将压电的红色电缆连接到每个尖端和环。

两条黑色电缆都连接到套管。

焊接时不要忘记将电缆穿过传感器板上的孔。

头部压电(压电连接到尖端)需要用10毫米厚的海绵泡沫夹在中间,如图所示。

下面一个,上面三个。把前三个锥体做成如图所示。

然后放在感应板上。

由于踢脚垫仅使用一个压电元件,因此只能使用尖端。

无需传感器板。压电下方有两个海绵泡沫

放置传感器偏离中心。

是因为arduino如果直接击中sensor,则无法判断击球的强度。

嗨帽子

电路与踢脚垫相同。

在压电体下方放一块 10 毫米厚的海绵泡沫。

压电很精致。小心不要弯曲或受伤。

第 5 步:10 英寸军鼓垫

首先安装轮辋传感器。

固定传感器板。坚决修好。从侧面看,使锥体末端可见 2-3 毫米。

当然,用8寸的打击垫做军鼓时,也是同样的步骤。

第 6 步:8 英寸 Kick PAD

首先,切割一根13毫米直径的不锈钢管。

制作两个 200 毫米和两个 365 毫米。

由于长度可以调整,所以即使长度有误差也没关系。

参照图片拼装。

为了固定管道,它设计成可以将M3螺母装入零件内部。

牢固地固定管道。使用 M3-15 毫米螺栓和螺母。

第 7 步:12 英寸踩镲

用厚纸做外壳后,我想如果你用厚纸我可以做钹。

第一的。将厚纸剪成直径为 300 毫米的圆形。做三个。

接下来,从中心做一个凹口。

最后,在与第一个缺口平行的 10mm 点处制作第二个缺口。

就这样,三个张着小嘴的吃豆人就做好了。

然后用胶带小心地将吃豆人的嘴合上,使其成为钹形。

涂上粘合剂并覆盖这些。不要忘记将粘合剂干净且薄地涂抹

用手牢牢握住,然后将重物放在周围并晾干。

为了静音,放一块 5 毫米厚的海绵并钻一个孔。你不能把洞开得很整齐,但你可以把洞藏起来,所以没关系。

通过用双面胶带连接传感器安装座和电缆导管来完成。如果你用胶枪可能会更容易。

第 8 步:踩镲控制器

踩镲控制器将踩镲的开启和关闭发送给arduino。

电路很简单。

由三部分组合而成。

将 FSR 连接到底部并固定插座。开个洞也能用FSR。

像照片一样将 10 毫米海绵连接到 FSR。

用 M3 - 10 毫米螺栓固定盖子。

虽然只有HIGH和LOW,但你可能想知道我为什么用FSR。

我用FSR来对应Roland、Yamaha等音源。

而在EZ DRUMMER 2等鼓专用音源中,踩镲的开度有几个阶段。

如果是FSR,可能只要修改代码就可以响应。不过我没试过。

第 9 步:USB - MIDI

这一步我们可以做什么?

单独使用usb线,你可以从arduino发送midi信号。

换句话说,让 arduino 被 iPhone 等识别为 MIDI 设备,无需任何额外的硬件。

首先,检查这个页面。

http://morecatlab.akiba.coocan.jp/lab/index.php/aruino/midi-firmware-for-arduino-uno-moco/

https://github.com/kuwatay/mocolufa

如果您将普通的 arduino UNO 直接连接到 iPhone,您将收到“Arduino UNO 不兼容”之类的错误消息。

所以,你必须重写arduino UNO中使用的USB芯片(ATmega16U2)。

https://www.arduino.cc/en/Hacking/DFUProgramming8U2

这条指令是如何重写hex文件。

请按照本网站进行操作,直到出现以下说明。

sudo dfu-programmer atmega16u2 flash Arduino-usbserial-uno.hex

只需将“Arduino-usbserial-uno.hex”替换为“dualMoco.hex”即可。

因此,

sudo dfu-programmer atmega16u2 flash dualMoco.hex

重写后,您的 Arduino 将被识别为 MIDI 设备。

如果如图所示将引脚短路,它将被识别为正常的Arduino。

如果不是(未短路时),arduino UNO 将被识别为 MIDI 设备。

换句话说,使用arduino IDE编写代码时,必须如图所示将引脚短路。

第 10 步:触发到 MIDI 转换器

盒子里有arduino UNO和Shield。

屏蔽电路见熔接图。

二极管是为了保护,但我看到arduino UNO有保护电路的信息,可能不需要二极管。有人知道吗?

先打印外壳和盖子的型号后,根据它制作屏蔽就好了。

还有一个封面的3D模型,但我用激光切割机做了一个封面。请选择你喜欢的。

第 11 步:使用 GarageBand 演奏

只需启动garageband 并连接。没有特别难的设定。

有许多适用于 PC 的 DAW 可以在此架子鼓上使用,包括 GarageBand。

其中Hydrogen是免费的,可以加声音。

第 12 步:设置

在做代码的时候,每次改值都要重写代码很麻烦,所以我希望能单独用arduino改值。

也就是说,这是为了调试代码而做的,所以有些项目不需要更改。

然而,根据压电体的大小、垫子的大小、海绵泡沫的硬度进行设置是必要的。

使用 INC/DEC 按钮选择乐器,使用 NEXT/BACK 按钮选择设置项目。在显示要设置的乐器和项目时按下 EDIT 按钮,您可以使用 INC/DEC 按钮更改值。然后,再次按下 EDIT 按钮确认更改。

看后面的视频你就会明白操作方法了。

阈值

发出声音的最低值

灵敏度

传感器灵敏度。放低的话,轻击也能获得高速度。

注意

笔记编号。通过改变,你可以改变乐器。请参考图片。

标志

判断跳动结束的值。您不必对其进行太多更改。将该值设置为 1 到 10 会很好。如果您将该值提高太多,则一次敲击会发出两次声音。如果放得太低,反复敲击可能会发不出声音。

扫描时间

在搜索峰值时,会在超过阈值后连续取值几毫秒。其中的最高值将达到峰值。这几毫秒是扫描时间。没有必要改变它。

头部/边缘

设置边缘的缓和。抬起它会使声音变得困难。如果您将其降低得太厉害,当您击中头部时,边缘会发出声音。关于头部和轮辋的判断,可能需要改进代码

踏板速度

与其他打击垫不同,踏板的速度是恒定的。初始值为100,请改成你喜欢的值。

屏蔽时间

这是一个与 FLAG 相关的值。没有必要改变它。抬高的话,连续打的时候可能听不到声音。

第 13 步:Fusion 360

除非更改尺寸,否则某些部件可能无法使用。编辑 STL 数据很困难。所以我上传了fusion 360数据。不过,由于我是边试验边编辑数据,所以最好不要过分依赖历史功能。

https://github.com/RyoKosaka/drums/tree/master/Fusion360

额外的

额外的步骤是在说明上。

https://www.instructables.com/id/Arduino-Minimal-Drum-Kit/

并且,详细的制作过程发布在这个博客上。

如果您有兴趣,请检查它。

有什么问题请随时问。

玩得开心!

代码

  • Hello Drum v2
Hello Drum v2Arduino
修改时间:05/12/2019 by George Brotherston
/* Drum MIDI Controller 创建:28/06/2017 by Ryo Kosaka 作为“HELLO DRUM”Ver.1.0 修改时间:05/12/2019 by George Brotherston*///库包含// #include  // Arduino 库(自动包含)// LOW(第41行)// HIGH(第40行)// INPUT_PULLUP(第47行)// digitalRead()(第177行)/ /analogRead()(第 178 行)#include  // MIDI 库 - 版本:4.3.1 // 包含  // MIDI 类(第 30 行)// 类方法“开始”(行55) #include  // LiquidCrystal - 版本:1.0.7 // 从 LiquidCrystal 类(第 45 行)实例化的 lcd 对象(在下面的变量部分)// 变量 - 声明和初始化 // 变量 - 编程布尔值 bSnareFlag =假; boolean bHihatFlag =false;布尔 bKickFlag =假; boolean bPedalFlag =false;布尔 bButtonState =true; boolean bButtonState_set =true;内部 iUPDOWN =0; int iNEXTBACK =0; // Arrays - Program // InstrumentSensor[6] ={threshold,sensitive, note, flag, velocity, iPeakValue} // 对于所有 InstrumentSensor 数组,'iPeakValue' 和 'velocity' 必须为零 // 所有 'aHIHAT[]' 和'aHIHAT_CLOSE[]' 数组元素应该具有相同的值,除了 'note' 元素。 int aSNARE[6] ={150, 950, 38, 3, 0, 0}; int aSNARE_RIM[6] ={5, 500, 37, 3, 0, 0}; int aHIHAT[6] ={100, 800, 46, 1, 0, 0}; int aHIHAT_CLOSE[6] ={100, 800, 42, 1, 0, 0}; int aKICK[6] ={200, 700, 36, 1, 0, 0}; // Instrument_ContinuousController[4] ={scantime, snare/rim,pedalVelocity, masktime} int aHIHAT_PEDAL[4] ={600, 0, 44, 0}; // InstrumentSensor_ParameterValue[4] ={threshold,sensitive, note, flag} int aSETTING[4] ={4, 500 ,100 ,1}; // 库 // LiquidCrystal.h // 常量(已经在库中定义,还在作用域内?如果没有,则在下面定义) // const int rs =12, en =11, d4 =5, d5 =4, d6 =3 , d7 =2; // 从 LiquidCrystal 类实例化的 lcd 对象(LiquidCrystal.h Line 45) LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // 将 LCD 接口引脚与关联的 Arduino 引脚编号关联 // MIDI.h // 初始化库 MIDI_CREATE_DEFAULT_INSTANCE();// 程序代码 // 程序执行 - Initial (program setup) void setup() { MIDI.begin(10); // 开始 (MIDI.h Line 55) lcd.begin(16, 2); // 开始 (LiquidCrystal.h Line 62) lcd.print("INITIALIZING..."); // 打印 (LiquidCrystal.h Line 45) lcd.setCursor(0, 1); // setCursor (LiquidCrystal.h Line 82) lcd.print("DRUM MIDI CONTROLLER"); pinMode(6, INPUT_PULLUP); // pinMode (Arduino.h Line 175); INPUT_PULLUP (Arduino.h Line 47) pinMode(7, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); pinMode(9, INPUT_PULLUP); pinMode(10, INPUT_PULLUP); } // 程序执行 - 稳态(连续循环直到断电) void loop() { // 鼓 MIDI 控制器电路 // 声明和初始化变量 int iButton_set =digitalRead(6); // 设置按钮 // digitalRead() (Arduino.h Line 177) int iButton_up =digitalRead(7); // 向上按钮 int iButton_down =digitalRead(8); // 向下按钮 int iButton_next =digitalRead(9); // 下一个按钮 int iButton_back =digitalRead(10); // 返回按钮 int iPiezoValue_A0 =analogRead(A0); // Piezo - 军鼓 //analogRead() (Arduino.h Line 178) int iPiezoValue_A1 =analogRead(A1); // 压电 - 军鼓边缘 int iPiezoValue_A2 =analogRead(A2); // 踩镲 int iPiezoValue_A3 =analogRead(A3); // 底鼓 int iFSRValue_A4 =analogRead(A4); // 踩镲踏板 // 编辑模式 int aUP[4] ={5, 50, 1,1}; // {阈值,灵敏度,注意,标志} int aUP_ADVANCE[4] ={1, 50, 1,1}; // {scantime,rim/head,踏板速度,masktime} // 注意:aINSTRUMENT[] 数组未在 char* 上方的 'Arrays' 中声明 aINSTRUMENT[] ={ "SNARE HEAD", "SNARE RIM", "HIHAT OPEN ", "HIHAT CLOSE", "HIHAT PEDAL", "KICK", "高级设置" }; // 注意:aSETTING[] 数组是在 char* 上方的 'Arrays' 中声明的 aSETTING[] ={ "THRESHOLD", "SENSITIVITY", "NOTE", "FLAG" }; // 注意:aSETTING_ADVANCE[] 未在 char* 上方的 'Arrays' 中声明 aSETTING_ADVANCE[] ={ "SCAN TIME", "HEAD / RIM ","PEDAL VELO", "MASK TIME" };如果(iUPDOWN <0){ iUPDOWN =6; } if (iUPDOWN> 6) { iUPDOWN =0; } if (iNEXTBACK <0) { iNEXTBACK =3; } if (iNEXTBACK> 3) { iNEXTBACK =0; } // 按钮编辑 // LOW (Arduino.h Line 41) if (iButton_set ==LOW &&bButtonState ==true &&bButtonState_set ==true) { lcd.clear();液晶打印(“编辑”); bButtonState =false; bButtonState_set =false;延迟(500); } if (iButton_set ==LOW &&bButtonState ==true &&bButtonState_set ==false) { lcd.clear(); lcd.print("编辑完成"); bButtonState =false; bButtonState_set =true;延迟(500); } if (iButton_up ==LOW &&bButtonState ==true &&bButtonState_set ==false) { switch (iUPDOWN) { case 0:aSNARE[iNEXTBACK] =aSNARE[iNEXTBACK] + aUP[iNEXTBACK];休息;情况 1:aSNARE_RIM[iNEXTBACK] =aSNARE_RIM[iNEXTBACK] + aUP[iNEXTBACK];休息; case 2:switch (iNEXTBACK) { case 2:aHIHAT[iNEXTBACK] =aHIHAT[iNEXTBACK] + aUP[iNEXTBACK];休息;默认值:aHIHAT_CLOSE[iNEXTBACK] =aHIHAT_CLOSE[iNEXTBACK] + aUP[iNEXTBACK]; aHIHAT[iNEXTBACK] =aHIHAT[iNEXTBACK] + aUP[iNEXTBACK]; } 休息; case 3:switch (iNEXTBACK) { case 2:aHIHAT_CLOSE[iNEXTBACK] =aHIHAT_CLOSE[iNEXTBACK] + aUP[iNEXTBACK];休息;默认值:aHIHAT_CLOSE[iNEXTBACK] =aHIHAT_CLOSE[iNEXTBACK] + aUP[iNEXTBACK]; aHIHAT[iNEXTBACK] =aHIHAT[iNEXTBACK] + aUP[iNEXTBACK]; } 休息; case 4:switch (iNEXTBACK) { case 0:aHIHAT_PEDAL[iNEXTBACK] =aHIHAT_PEDAL[iNEXTBACK] + aUP[iNEXTBACK];休息;情况2:aHIHAT_PEDAL[iNEXTBACK] =aHIHAT_PEDAL[iNEXTBACK] + aUP[iNEXTBACK];休息; } 休息;情况5:aKICK[iNEXTBACK] =aKICK[iNEXTBACK] + aUP[iNEXTBACK];休息;情况 6:aSETTING[iNEXTBACK] =aSETTING[iNEXTBACK] + aUP_ADVANCE[iNEXTBACK];休息; bButtonState =false;延迟(30); } if (iButton_down ==LOW &&bButtonState ==true &&bButtonState_set ==false) { switch (iUPDOWN) { case 0:aSNARE[iNEXTBACK] =aSNARE[iNEXTBACK] - aUP[iNEXTBACK];休息; case 1:aSNARE_RIM[iNEXTBACK] =aSNARE_RIM[iNEXTBACK] - aUP[iNEXTBACK];休息; case 2:switch (iNEXTBACK) { case 2:aHIHAT[iNEXTBACK] =aHIHAT[iNEXTBACK] - aUP[iNEXTBACK];休息; default:aHIHAT_CLOSE[iNEXTBACK] =aHIHAT_CLOSE[iNEXTBACK] - aUP[iNEXTBACK]; aHIHAT[iNEXTBACK] =aHIHAT[iNEXTBACK] - aUP[iNEXTBACK]; } 休息; case 3:switch (iNEXTBACK) { case 2:aHIHAT_CLOSE[iNEXTBACK] =aHIHAT_CLOSE[iNEXTBACK] - aUP[iNEXTBACK];休息; default:aHIHAT_CLOSE[iNEXTBACK] =aHIHAT_CLOSE[iNEXTBACK] - aUP[iNEXTBACK]; aHIHAT[iNEXTBACK] =aHIHAT[iNEXTBACK] - aUP[iNEXTBACK]; } 休息; case 4:switch (iNEXTBACK) { case 0:aHIHAT_PEDAL[iNEXTBACK] =aHIHAT_PEDAL[iNEXTBACK] - aUP[iNEXTBACK];休息; case 2:aHIHAT_PEDAL[iNEXTBACK] =aHIHAT_PEDAL[iNEXTBACK] - aUP[iNEXTBACK];休息; } 休息; case 5:aKICK[iNEXTBACK] =aKICK[iNEXTBACK] - aUP[iNEXTBACK];休息; case 6:aSETTING[iNEXTBACK] =aSETTING[iNEXTBACK] - aUP_ADVANCE[iNEXTBACK];休息; } bButtonState =false; delay(30); } // Pushbuttons UP; DOWN; NEXT; BACK if (iButton_up ==LOW &&bButtonState ==true &&bButtonState_set ==true) { iUPDOWN =++iUPDOWN; bButtonState =false; delay(30); } if (iButton_down ==LOW &&bButtonState ==true &&bButtonState_set ==true) { iUPDOWN =--iUPDOWN; bButtonState =false; delay(30); } if (iButton_next ==LOW &&bButtonState ==true &&bButtonState_set ==true) { iNEXTBACK =++iNEXTBACK; bButtonState =false; delay(30); } if (iButton_back ==LOW &&bButtonState ==true &&bButtonState_set ==true) { iNEXTBACK =--iNEXTBACK; bButtonState =false; delay(30); } if (bButtonState ==false &&iButton_up ==HIGH &&iButton_down ==HIGH &&iButton_next ==HIGH &&iButton_back ==HIGH &&iButton_set ==HIGH) { // HIGH is defined in Arduino.h Line 40 switch (iUPDOWN) { case 0:lcd.clear(); lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aSNARE[iNEXTBACK]);休息; case 1:lcd.clear(); lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aSNARE_RIM[iNEXTBACK]);休息; case 2:lcd.clear(); lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aHIHAT[iNEXTBACK]);休息; case 3:lcd.clear();lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aHIHAT_CLOSE[iNEXTBACK]);休息; case 4:lcd.clear(); lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aHIHAT_PEDAL[iNEXTBACK]);休息; case 5:lcd.clear(); lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aKICK[iNEXTBACK]);休息; case 6:lcd.clear(); lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING_ADVANCE[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aSETTING[iNEXTBACK]);休息; } bButtonState =true; } // Instrument Sensors // Snare Drum if (iPiezoValue_A0> aSNARE[0] &&bSnareFlag ==false) { for (int i =0; i  aSNARE[4]) { aSNARE[4] =iPeak_A0; } if (iPeak_A1> aSNARE_RIM[4]) { aSNARE_RIM[4] =iPeak_A1; } } aSNARE[5] =aSNARE[4]; aSNARE_RIM[5] =aSNARE_RIM[4]; aSNARE[4] =map(aSNARE[4], aSNARE[0], aSNARE[1], 0, 127); aSNARE_RIM[4] =map(aSNARE_RIM[4], aSNARE_RIM[0], aSNARE_RIM[1], 0, 127); aSNARE[4] =(aSNARE[4] * aSNARE[4]) / 127; // Curve setting //aSNARE_RIM[4] =(aSNARE_RIM[4] * aSNARE_RIM[4]) / 127; if (aSNARE[4] <=1) { aSNARE[4] =1; } if (aSNARE[4]> 127) { aSNARE[4] =127; } if (aSNARE_RIM[4] <=0) { aSNARE_RIM[4] =0; } if (aSNARE_RIM[4]> 127) { aSNARE_RIM[4] =127; } if (aSNARE_RIM[5]> aSETTING[1]) { MIDI.sendNoteOn(aSNARE_RIM[2], aSNARE_RIM[4], 1); //(note, velocity, channel) MIDI.sendNoteOn(aSNARE_RIM[2], 0, 1); lcd.clear(); lcd.print("SNARE RIM"); lcd.setCursor(0, 1); lcd.print(aSNARE_RIM[4]); bSnareFlag =true; } //else if (aSNARE[5]> aSNARE_RIM[5]) else { MIDI.sendNoteOn(aSNARE[2], aSNARE[4], 1); //(note, velocity, channel) MIDI.sendNoteOn(aSNARE[2], 0, 1); lcd.clear(); lcd.print("SNARE HEAD"); lcd.setCursor(0, 1); lcd.print(aSNARE[4]); //lcd.setCursor(10, 1); //lcd.print(aSNARE_RIM[5]); bSnareFlag =true; } } // Hi-Hat Cymbal if (iPiezoValue_A2> aHIHAT[0] &&bHihatFlag ==false) { for (int i =0; i  aHIHAT[4]) { aHIHAT[4] =iPeak_A2; } } aHIHAT[5] =aHIHAT[4]; aHIHAT[4] =map(aHIHAT[4], aHIHAT[0], aHIHAT[1], 0, 127); aHIHAT[4] =(aHIHAT[4] * aHIHAT[4]) / 127; if (aHIHAT[4] <=1) { aHIHAT[4] =1; } if (aHIHAT[4]> 127) { aHIHAT[4] =127; } if (iPiezoValue_A0 =aHIHAT_PEDAL[0]) { MIDI.sendNoteOn(aHIHAT_CLOSE[2], aHIHAT[4], 1); MIDI.sendNoteOn(aHIHAT_CLOSE[2], 0, 1); lcd.clear(); lcd.print("HIHAT CLOSE"); lcd.setCursor(0, 1); lcd.print(aHIHAT[4]); bHihatFlag =true; } } // Hi-hat Pedal if (iPiezoValue_A0> aHIHAT_PEDAL[0] &&bPedalFlag ==false) { MIDI.sendNoteOn(aHIHAT_PEDAL[2], aSETTING[2], 1); // (note, velocity, channel) MIDI.sendNoteOn(aHIHAT_PEDAL[2], 0, 1); lcd.clear(); lcd.print("HIHAT PEDAL"); lcd.setCursor(0, 1); lcd.print(aSETTING[2]); bPedalFlag =true; } // Kick Drum if (iPiezoValue_A3> aKICK[0] &&bKickFlag ==false) { for (int i =0; i  aKICK[4]) { aKICK[4] =iPeak_A3; } } aKICK[5] =aKICK[4]; aKICK[4] =map(aKICK[4], aKICK[0], aKICK[1], 0, 127); aKICK[4] =(aKICK[4] * aKICK[4]) / 127; if (aKICK[4] <=1) { aKICK[4] =1; } if (aKICK[4]> 127) { aKICK[4] =127; } MIDI.sendNoteOn(aKICK[2], aKICK[4], 1); MIDI.sendNoteOn(aKICK[2], 0, 1); lcd.clear(); lcd.print("KICK"); lcd.setCursor(0, 1); lcd.print(aKICK[4]); bKickFlag =true; }// --- BEGIN 'Code in Progress' --- //// --- I could be wrong, but this is what it appears to be --- and out of curiousity what is purpose of this sequence? -- // // I=(A0); // Previous Code // -- DOES iSensorValue_A0 need to be declared as an integer? How does this relate to iPiezoValue_A0? -- // if (iSensorValue_A0 <(aSNARE[5] * (0.01 * aSNARE[3]))) { bSnareFlag =false; } if (iPiezoValue_A0 <=aHIHAT_PEDAL[0] &&iPiezoValue_A2 <(aHIHAT[5] * (0.01 * aHIHAT[3])) &&bHihatFlag ==true) { delay(aSETTING[3]); // iSensorValue_A1 is reading analogRead(A2), but this is aHIHAT_PEDAL (which is analogRead(A2) int iSensorValue_A1 =analogRead(A2); if (iSensorValue_A1 <(aHIHAT[5] * (0.01 * aHIHAT[3]))) { bHihatFlag =false; } } if (iPiezoValue_A0>=aHIHAT_PEDAL[0] &&iPiezoValue_A2 <(aHIHAT[5] *(0.01 * aHIHAT[3])) &&bHihatFlag ==true) { delay(aSETTING[3]); int iSensorValue_A2 =analogRead(A2); if (iSensorValue_A2 <(aHIHAT[5] * (0.01 * aHIHAT[3]))) { bHihatFlag =false; } } if (iPiezoValue_A3 <(aKICK[5] * (0.01 * aKICK[3])) &&bKickFlag ==true) { delay(aSETTING[3]); // -- Should declared iSensorValue_A3 be iPiezoValue_A3? iSensorValue_A3 is declared but not used anywhere?? int iSensorValue_A3 =analogRead(A3); if (iPiezoValue_A3 <(aKICK[5] * (0.01 * aKICK[3]))) { bKickFlag =false; } } if (iPiezoValue_A0 <=aHIHAT_PEDAL[0] &&bPedalFlag ==true) { bPedalFlag =false; }// --- END 'Code in Progress' --- // }
Hello Drum

示意图

circuit_nZotR7rJMM.fzz

制造工艺

  1. 中国外科医生用 3D 打印机制作钛骨
  2. 设计套件通过光学传感器测量血压
  3. 如何将 GrabCAD Print 与 Stratasys 3D 打印机连接
  4. 你可以用 3D 打印机做什么?
  5. NeoPixel Ring 的陀螺仪乐趣
  6. 云服装
  7. Unopad - 带有 Ableton 的 Arduino MIDI 控制器
  8. 带有 Arduino 的简单障碍物传感器
  9. 使用 Arduino 进行语音识别和合成
  10. 带有 CI-V 端口的 Icom 无线电上的外部 S-Meter
  11. 带有 RDA5807 的迷你立体声收音机