3个版本 (破坏性)

0.3.0 2023年5月2日
0.2.0 2021年9月16日
0.1.0 2020年7月11日

#181 in 渲染

MIT许可证

170KB
3K SLoC

launchy

docs.rs crates.io License

为Novation Launchpad设备提供一个详尽的Rust API,优化以实现最大的表达性和最少的样板代码!


Launchy是Rust编程语言的Novation Launchpad MIDI设备库。

特性

  • 画布API提供了一种强大而简洁的方式来控制您的Launchpads,用于游戏或小型灯光秀
  • 直接输入/输出API提供对您的设备的绝对控制和对整个MIDI API的精细访问
  • 可以将多个Launchpad连接在一起,并像使用单个大型设备一样使用它们
  • 可选支持embedded-graphics
  • 非常模块化设计:很容易添加对新设备的支持,或者向Canvas添加新功能

支持的设备

  • Launchpad
  • Launchpad S
  • Launchpad Mini
  • Launchpad Control
  • Launchpad Control XL
  • Launchpad Pro
  • Launchpad MK2
  • Launchpad X
  • Launchpad Mini MK3
  • Launchpad Pro MK2

Canvas API

Launchy提供了一个Canvas特质,允许您抽象出Launchpad的特定硬件细节,并编写简洁、高效且与Launchpad无关的代码。

Canvas API甚至允许您将多个Launchpad连接在一起,并像它们是一个单一设备一样使用它们。有关详细信息,请参阅CanvasLayout

直接输入/输出API

在您需要直接访问设备API的情况下,Canvas API可能会妨碍您。

例如,如果您想以编程方式检索Launchpad MK2的固件版本

let input = launchy::mk2::Input::guess_polling()?;
let mut output = launchy::mk2::Output::guess()?;

output.request_version_inquiry()?;
for msg in input.iter() {
    if let launchy::mk2::Message::VersionInquiry { firmware_version, .. } = msg {
        println!("The firmware version is {}", firmware_version);
    }
}

示例

令人满意的脉冲灯光效果

// Setup devices
let (mut canvas, poller) = launchy::CanvasLayout::new_polling();
canvas.add_by_guess_rotated::<launchy::control::Canvas>(0, 14, launchy::Rotation::Right)?;
canvas.add_by_guess_rotated::<launchy::mk2::Canvas>(10, 18, launchy::Rotation::UpsideDown)?;
canvas.add_by_guess_rotated::<launchy::s::Canvas>(2, 8, launchy::Rotation::Right)?;
let mut canvas = canvas.into_padded();

// Do the actual animation
for color in (0u64..).map(|f| Color::red_green_color(f as f32 / 60.0 / 2.5)) {
    for msg in poller.iter_for_millis(17).filter(|msg| msg.is_press()) {
        canvas[msg.pad()] = color * 60.0;
    }
    canvas.flush()?;

    for pad in canvas.iter() {
        let surrounding_color = pad.neighbors_5().iter()
                .map(|&p| canvas.get(p).unwrap_or(Color::BLACK))
                .sum::<Color>() / 5.0 / 1.05;

        canvas[pad] = canvas[pad].mix(surrounding_color, 0.4);
    }
}

多个Launchpad之间的无缝文本滚动(利用embedded_graphics

(此图像显示了单词"Hello"的前三个字母)

use embedded_graphics::{fonts::{Font6x8, Text}, prelude::{Drawable, Point}, style::TextStyle};

// Setup the Launchpad layout
let mut canvas = launchy::CanvasLayout::new(|_msg| {});
canvas.add_by_guess_rotated::<launchy::control::Canvas>(0, 14, launchy::Rotation::Right)?;
canvas.add_by_guess_rotated::<launchy::mk2::Canvas>(10, 18, launchy::Rotation::UpsideDown)?;
canvas.add_by_guess_rotated::<launchy::s::Canvas>(2, 8, launchy::Rotation::Right)?;

// Do the text scrolling
let mut x_offset = 19;
loop {
    canvas.clear();

    let t = Text::new("Hello world! :)", Point::new(x_offset, 3))
        .into_styled(TextStyle::new(Font6x8, Color::RED.into()))
        .draw(&mut canvas).unwrap();

    canvas.flush()?;

    sleep(100);
    x_offset -= 1;
}

为什么不用 launch-rs 呢?

  • 上一次提交是在2017年
  • 仅支持 Launchpad MK2
  • 只提供对 Launchpad 的低级访问,无法编写高级、简洁的接口代码
  • 使用 PortMidi 包,它的开发不如 midir 活跃,而 Launchy 正在使用 midir
  • 没有 Launchy 提供的任何高级功能

依赖项

~0.2–29MB
~364K SLoC