×

节拍器开源构建

消耗积分:0 | 格式:zip | 大小:0.23 MB | 2023-07-07

王利祥

分享资料个

描述

介绍

该项目将创建一个节拍器,它可以随着来自 Alexa 设备的亚马逊音乐节拍移动。添加图片,它就变成了……METRO-GNOME!

它是 LEGO MINDSTORMS 语音挑战任务的简单扩展。在你开始这个项目之前,你需要完成设置,至少完成任务 1 和 2。这将涵盖基础知识,所以我不会在这里重复这些说明。

Alexa 界面目前只提供音乐节奏,但希望将来能扩展到提供有关正在播放的曲目的更多信息。我真的希望我的项目对流派甚至特定歌曲有不同的反应,但目前还没有这些信息。

注意:我认为这仅适用于现阶段的亚马逊音乐,因此如果您使用其他音乐服务,则不会提供速度数据。

通过与她一起完成示例任务,我帮助我女儿开始了她的项目。任务 2 让我很烦,因为动作似乎与节拍不合拍。我想我会创建一个简单的项目来改进这种能力,这就是结果。

这与任务 2 有何不同?

如果您查看任务 2 中的 _dance_loop 代码,它会计算 milli_per_beat,然后乘以 0.65(!)。我猜这个调整是为了让每个电机每拍运行 150 毫秒。结果是一个近似值,但有误差。如果您仔细观察整个曲目中的动作是否保持节拍,则此错误很明显。

def _dance_loop(self, bpm):
   """
   Perform motor movement in sync with the beat per minute value from tempo data.
   :param bpm: beat per minute from AGT
   """
   color_list = ["GREEN", "RED", "AMBER", "YELLOW"]
   led_color = random.choice(color_list)
   motor_speed = 400
   milli_per_beat = min(1000, (round(60000 / bpm)) * 0.65)
   print("Adjusted milli_per_beat: {}".format(milli_per_beat), file=sys.stderr)
   while self.trigger_bpm == "on":
      # Alternate led color and motor direction
      led_color = "BLACK" if led_color != "BLACK" else random.choice(color_list)
      motor_speed = -motor_speed
      self.leds.set_color("LEFT", led_color)
      self.leds.set_color("RIGHT", led_color)
      self.right_motor.run_timed(speed_sp=motor_speed, time_sp=150)
      self.left_motor.run_timed(speed_sp=-motor_speed, time_sp=150)
      time.sleep(milli_per_beat / 1000)

对于我的,我创建了一个采用不同方法的 _beat_loop。我在没有调整的情况下计算每个循环的秒数,并使用计时器来确保每个电机运动都与节拍同步。为了允许更快地移动更高节奏的曲目,电机速度也根据每分钟的节拍进行缩放。这可确保电机在进行下一次运动之前到达终点。

def _beat_loop(self, bpm):
   """
   Perform motor movement in sync with the beat per minute value from tempo data.
   :param bpm: beat per minute from AGT
   """
   self.motor.position = 0
   pos = 40
   speed = min(1000,bpm*2)
   seconds_per_beat = 60/bpm
   next_time = time() + seconds_per_beat
   print("Adjusted seconds per beat: {}".format(seconds_per_beat), file=sys.stderr)
   while self.trigger_bpm == "on":

      # wait until next movement time
      while time() < next_time:
         pass

      # move motor to next position
      self.motor.run_to_abs_pos(position_sp=pos, speed_sp=speed, stop_action="hold")
      # change so next position is on opposite side
      pos = -pos
      # set time for next movement
      next_time = next_time + seconds_per_beat

   # move to straight position when tempo has stopped
   self.motor.run_to_abs_pos(position_sp=0, speed_sp=speed, stop_action="hold")
   print("Exiting BPM process.", file=sys.stderr)

为什么是侏儒?

简单的。我是一个爸爸,所以坏双关语很好!此外,侏儒很酷,它使创作看起来更有趣。

搭建乐高

乐高积木搭建很简单,但我在Bricklink Studio 2.0文件中包含了搭建说明。您需要的文件位于“原理图”部分下。

要连接小矮人,您需要发挥内在的工艺技能。对于我的,我只是用一些开口销连接了一些硬纸板,然后将侏儒图片粘贴到硬纸板上。

 
 
 
pYYBAGOStxyAMCitAAsnDuMlAMg820.jpg
 
1 / 2
 

EV3 代码

该项目不需要任何 Alexa Skill 代码,因为它依赖于每当播放歌曲时通过标准接口提供给 EV3 的信息。享受!

 

下一步去哪里?

Alexa MusicData界面只是一个测试版,只包括节奏。我希望它包含更多关于未来正在播放的曲目的数据,这样你就可以做其他事情,例如圣诞机器人在播放圣诞类型音乐时开始跳舞。在那之前,你可以看到你能用节奏做什么。

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !