我们如何制作 Muletallica

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

这篇文章是 一个由三部分组成的系列文章中的第二部分, 该系列文章涵盖了我们今年第一次内部黑客马拉松的 联网项目,我们在 connect 2015 的第一个物联网集成区中展示了这些项目。在那里想念我们吗?不用担心,您不仅会感受到我们在下面建造的酷炫装置,您还会在前排座位上了解我们如何建造它们以及使用什么技术。所以现在,穿上你最喜欢的摇滚明星牛仔裤,跳进 mosh 坑,了解团队如何构建 muletallica,这是一种为我们的与会者提供的交互式视觉/音乐体验,将 leap motion 和智能灯泡等设备与电吉他连接起来,和一个甜椒。

为什么我们建造它

muletallica 来自我们 4 月份在 mulesoft 举办的内部物联网黑客马拉松。这是一个团队项目,由 federico amdam、jesica fera、pablo carballo 和我自己构建,我们都在 mulesoft 的布宜诺斯艾利斯办公室工作。

muletallica 的诞生源于我最初一直在修补很长一段时间的东西:使用技术创建交互式音乐装置的想法,可以让人们——可能没有任何音乐知识或技能——体验制作音乐的乐趣一种有趣且富有创意的方式,学习曲线最小。


在黑客马拉松期间,我们打算完成的是采用我之前的一些音乐实验,并使用 mule 将它们与智能灯集成在一起,通过这种方式,我们将使体验更加身临其境和引人入胜。通过灯光提供的附加视觉反馈,人们更容易联想到对人们行为的反应。

快进到一个月后,我代表我们的团队在旧金山参加了 connect 会议。与此同时,我们的营销团队帮助设计了一个外观精美的装置来展示 muletallica,这确实使该项目脱颖而出。在那里,我基本上实现了梦想,因为(至少有几天)我的工作描述涉及弹吉他和向人们介绍很酷的科技玩具。任何好奇地走上看台的人都会被邀请加入乐队并和我们一起即兴演奏,他们总是很好奇这一切是如何完成的,所以我很高兴向他们介绍所有的交互设计和底层架构。

我们为此使用了 milight lights,它公开了一个不太容易使用的 python api 。更为人所知的 phillips hue lights 公开了一个很好的 api ,它可以很容易地接收 http 请求……不过那太容易了。我们想要一个挑战,在某个地方我们可以炫耀 mule 的能力,让丑陋的 遗留 界面变得可用,所以这就是我们选择 milight 的原因。

muletallica, 玩玩


在上面的视频中,您可以看到我演奏了几种不同的乐器。每个仪器都连接到不同的智能灯,并通过 mule 消息设置其色调和强度:

  • 空气钢琴 :起初,我将 跳跃式运动传感器 当作空气钢琴来弹奏,只需轻敲想象中的琴键即可弹奏。这样做的美妙之处在于,无论您演奏什么,它总是在正确的调上,并根据节拍进行调整。从字面上看,您演奏的任何东西在音乐上总是听起来不错,或者至少不会令人痛苦。同时,每播放一个音符,我们就会闪烁一次,其色调映射到音符的音高。
  • 吉他决斗: 弹吉他时,我弹奏的音符顺序会被存储,因此弹奏空气钢琴会自动让您完成相同的音符顺序。这在两种乐器之间形成了一种非常有趣的请求-响应类型的音乐对话,其中音符相同但对它们的时间的自由解释足以允许一些令人兴奋的音乐表达。这也是一种与观众互动的有趣方式,他们勇敢地接受挑战,播放我演奏的任何东西。其中一盏灯被映射到吉他上,随着我弹奏的每个音符闪烁,将其色调映射到音高。
  • 添加节拍 :当将一系列印刷卡片中的一张呈现给笔记本电脑上的网络摄像头时,鼓模式会发生变化。这里的计算机正在使用 reactivision ,一种最初为 reactable 构建的计算机视觉软件来识别这些卡片。在我们的设置中使用它是为了向 reactable 的创造者 sergi jordá 致敬,他是我的一位教授,他首先启发了我去追求让每个人都可以创作音乐的理想。其中一盏灯随着鼓的节拍闪烁,将节拍的强度映射到光度,它也会在模式改变时改变颜色。鼓声模式的每次变化也会触发一段三秒的短视频的播放。
  • wiiii 和 wubwub :将鼓点更改为最电子化的模式后,播放与之前相同的跳跃运动传感器会调用类似 dubstep 的 类似特雷门的乐器,该乐器会响应您将手放在上面的高度和角度传感器。它实际上可以分辨出你拿着的是哪只手,并根据它看到的是哪只手来演奏不同的乐器。我将其中一种乐器称为“wiiii”,另一种称为“wubwub”……我想您可以从视频中轻松分辨出哪个是哪个。这些仪器的每一个变化也通过其相应光的色调变化来体现。

  • 灯笼椒: 我们添加的一种音乐蔬菜激起了很多参观者的好奇心。它是一种连接到 makey makey 的 实际蔬菜,每次有人触摸它时都会以和弦变化作为回应(经过一系列预定义的和弦)。是的,触摸灯笼椒会产生一种——难以察觉的低——电流通过你的身体。有些人似乎对这个想法有点不安,然后我会向他们保证我们使用的灯笼椒是 100% 有机的、公平贸易的、没有任何添加剂的新鲜农产品,然后继续向他们展示标签证明它实际上是有机的。每当触摸灯笼椒时,其中一盏灯会改变颜色。
  • 可以用 muletallica 制作的音乐与金属乐的声音相去甚远……它可以被描述为柔和的粉红色 floydish trance 诱导前卫摇滚,或者有时被描述为完全扭曲的合成声音 dubstep,但肯定不会像重金属或任何甚至微弱接近的东西。我们想出了这个名字作为一个随机的双关语,我们从未想过会被认真对待作为一个专有名称,但人们似乎很喜欢它,所以我们就采用了它......就像他们所说的那样,如果你建立它, 他们会来。

    muletallica的后台

    我们所有的 things zone 项目集成都 以某种方式在其内部结构中展示了 mulesoft 产品。就 muletallica 而言,我必须承认 mule 不是该项目的骨干,但仍然是其结构的重要组成部分。

    骨干是 usine ,一个不太知名的法国软件,实际上用途广泛,非常适合这样的现场表演。它与 mule 共享某种理念,因为您也可以通过拖放包括各种 连接器 和转换器的原子组件来构建流程。就像在 anypoint studio 中一样,所有内容都通过图形界面公开,同时您也可以进入代码并编写。

    所涉及的大部分外部组件都通过 midi 连接在一起,这是音乐接口中广泛接受的标准。由于该标准的流行,在使用 reactivision 或 mogees 进行通信时,连接性不是一个挑战。然而,我们使用的灯不支持 midi 或任何其他通用标准,因此我们必须真正发挥集成开发人员的作用并解决这个难题。

    然后我们构建了一个 raml 定义,它公开了一系列用于调用我们的灯的方法,有了它,构建一个 apikit 项目真的很容易,并让它自动充实我们构建一个整洁的 restful 所需的所有脚手架。包装他们丑陋的 api。然后我们将几行 python 代码 注入到 mule 中,这些代码执行了构成 milight api 的命令,以及 python midi 库的命令,它允许我们接收使用发送的 midi 消息并将它们变成 mule 消息。

    我们为将 milight api 包装在 rest api 中而编写的 raml 定义:

    
     #%raml 0.8
    title: muletallica
    version: 1.0.0
    baseuri: http://server/lights/{group}
    /effects:
      displayname: effects
      /{group}:
        displayname: group
        /gamma:
          displayname: gamma
          put:
            description: change color gamma in a group of lights to any color
            body: 
              application/json:
                example: |
                 {
                   "note": 1
                 }
        /directcolor:
          displayname: direct color
          put:
            description: change color gamma in a group of lights, to predefined colors
            body: 
              application/json:
                example: |
                 {
                   "note": 32,
                   "velocity": 100
                 }
        /intensity:
          displayname: intensity
          put:
            description: change brightness in a group of lights
            body: 
              application/json:
                example: |
                 {
                   "velocity": 1
                 }
        /both:
          displayname: both
          put:
            description: flicker with color and intensity
            body: 
              application/json:
                example: |
                 {
                   "note": 1,
                   "velocity": 1
                 }
        /flicker:
          displayname: flicker
          put:
            description: make a group of lights flicker
            body: 
              application/json:
                example: |
                 {
                   "note": 1
                 }
        /wiii:
          displayname: wiii
          put:
            description: make wiii effect in a group of lights
            body: 
              application/json:
                example: |
                 {
                   "note": 1,
                   "velocity": 1
                 }
        /wub:
          displayname: wub
          put:
            description: make wub effect in a group of lights
            body: 
              application/json:
                example: |
                 {
                   "note": 1,
                   "velocity": 1
                 }
    

    我们的 mule 流的 xml。其中大部分是由 apikit 从上面的 文件 自动构建的

    
     #%raml 0.8
    title: muletallica
    version: 1.0.0
    baseuri: http://server/lights/{group}
    /effects:
      displayname: effects
      /{group}:
        displayname: group
        /gamma:
          displayname: gamma
          put:
            description: change color gamma in a group of lights to any color
            body: 
              application/json:
                example: |
                 {
                   "note": 1
                 }
        /directcolor:
          displayname: direct color
          put:
            description: change color gamma in a group of lights, to predefined colors
            body: 
              application/json:
                example: |
                 {
                   "note": 32,
                   "velocity": 100
                 }
        /intensity:
          displayname: intensity
          put:
            description: change brightness in a group of lights
            body: 
              application/json:
                example: |
                 {
                   "velocity": 1
                 }
        /both:
          displayname: both
          put:
            description: flicker with color and intensity
            body: 
              application/json:
                example: |
                 {
                   "note": 1,
                   "velocity": 1
                 }
        /flicker:
          displayname: flicker
          put:
            description: make a group of lights flicker
            body: 
              application/json:
                example: |
                 {
                   "note": 1
                 }
        /wiii:
          displayname: wiii
          put:
            description: make wiii effect in a group of lights
            body: 
              application/json:
                example: |
                 {
                   "note": 1,
                   "velocity": 1
                 }
        /wub:
          displayname: wub
          put:
            description: make wub effect in a group of lights
            body: 
              application/json:
                example: |
                 {
                   "note": 1,
                   "velocity": 1
                 }
    

    这个项目使我们能够在处理同时到达的大量请求流时展示 mule 的速度和稳定性。在音乐中,时间是最重要的事情,因为最轻微的延迟都会导致界面无法用于音乐交互,这就是为什么音乐是测试系统实时准备情况的最终挑战。一开始我们确实遇到了一些延迟问题,但我们很快意识到瓶颈实际上是我们的 wifi 信号,而不是 mule。有了这个修复,我们就到了延迟几乎察觉不到的地步。我们正在运行的音乐软件对机器资源的占用相当大,而我们在同一台笔记本电脑上运行 mule ……即便如此,我们也没有遇到任何明显的延迟。

    展望未来,如果有人花时间为 mule 构建一个 midi 连接器,那将是惊人的,有了它,整个项目就可以围绕 mule 构建,甚至可以控制音符的触发和其他一切……我真的很期待有一天这样做!