如何使用node.js创建启动板迷你时钟
#typescript #node #raspberrypi

LaunchPad Mini是一个MIDI控制器,具有8x8按钮,可用于触发剪辑,播放音符和控制各种软件应用程序。您可以使用LaunchPad Mini进行的一个有趣的项目是将其变成数字时钟。该项目使用nodejs和midi-stream npm package与设备进行通信。

在这篇博客文章中,我将概述所采取的步骤和遇到的问题。

Image description

自己测试时钟

在开始之前,请确保您有以下内容:

  • 启动板迷你设备
  • 安装在计算机上的nodejs

步骤1:设置项目

步骤2:执行程序

  • npx ts-node src/application/console.ts执行项目

Select a port (running on Raspberry Pi)

建立时钟

开始,我首先设置了一系列测试,以确保我可以成功阐明单个按钮。从那里,我开发了一个基本的JavaScript应用程序,以探索诸如颜色映射和从发射台上到网格的数据映射等概念。

var MidiStream = require("midi-stream");
//https://www.youtube.com/watch?v=JatNuVsbsEQ

var duplex = MidiStream("Launchpad Mini");

duplex.write([176, 0, 0]); //clear all
//duplex.pipe(duplex);
duplex.on("data", function (data) {
  console.log(data);
  //console.log(mapToGrid(data[1]));

  //buttons across top 104 - 111
  //botton down right 8,24,40,56,72,88,104,120

  play(mapToGrid(data[1]).row, mapToGrid(data[1]).col, randomVelocity());
});

const play = (row, col, velocity, delay) => {
  var note = mapToMidi(row, col);

  setTimeout(() => {
    duplex.write([144, note, velocity]);
  }, delay || 0);
};

const mapToGrid = (data) => {
  const row = Math.floor(data / 16);
  const col = data % 8;
  return { row, col };
};
const mapToMidi = (row, col) => {
  return row * 16 + col;
};
const randomVelocity = () => {
  return Math.floor(Math.random() * 100);
};

在MIDI接口上配置按钮时,发送一个值数组以指定所需的行为。例如,stream.write([176,0,0])可用于关闭按钮,而stream.write([144,0,3])将其打开。数组中的第一个值表示所需的状态,176表示“关闭”,144表示“打开”。第二个值对应于要配置的特定按钮,尽管经过一些实验才能完全掌握数字和按钮之间的映射,但我最终掌握了它。最后,第三个值指定了按钮的颜色,并且再次需要进行一些测试以了解值和颜色之间的关系。

Grid Layout

代码库是在六边形体系结构中进行的,具有三个主要组件:

应用程序 - 此组件负责启动时钟应用程序。
域 - 在这里,域对象管理应用程序功能的大部分。
基础架构 - 最后,基础架构组件处理外部实体,例如启动板Mini的低级代码。
在所有单元测试中,Gridmanager测试是最重要的。这些测试验证了网格正确映射到MIDI调用,以确保时钟的正确操作。

总而言之,这个项目是一项令人愉快的努力,使我能够将新的生命注入旧设备。我什至甚至在Raspberry Pi上安装了该应用程序,在Raspberry Pi上运行24/7,是我的桌子的时尚且功能性的装饰。