3个版本 (破坏性)
0.3.0 | 2023年5月2日 |
---|---|
0.2.0 | 2021年9月16日 |
0.1.0 | 2020年7月11日 |
#181 in 渲染
170KB
3K SLoC
launchy
为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 呢?
依赖项
~0.2–29MB
~364K SLoC