1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//! Clavia / Nord device transport and vendor protocol over USB.
//!
//! > This is an unofficial, community project: **not affiliated with, endorsed
//! > by, or supported by Clavia DMI AB**. "Nord" and the instrument names are
//! > Clavia's trademarks, used here only to identify which files this crate
//! > reads.
//!
//! Layered so the protocol is testable without hardware:
//!
//! - [`wire`] — message framing and codec. Pure, fully decoded, no I/O.
//! - [`transport`] — the byte pipe. The only part that touches a device.
//! - [`session`] — the transaction wrapper every operation runs inside.
//! - [`op`] — typed operations.
//!
//! The wire format was reverse-engineered from a corpus of NSM captures and is
//! verified against every message in it.
//!
//! # Portability
//!
//! Desktop (macOS/Linux/Windows) via `nusb`, browsers via WebUSB. WebUSB is the
//! binding constraint on the API shape — see [`transport::Transport`] for why there
//! are no `Send` bounds, and why enumeration is deliberately backend-specific rather
//! than part of the portable core.
pub use ;
pub use ;
pub use Transport;
pub use ;
pub use ReplayTransport;
/// Block on a future without pulling in a full async runtime.
///
/// The crate is deliberately runtime-agnostic (see [`transport::Transport`] for why
/// there are no `Send` bounds), so this exists for CLIs and tests that just want the
/// answer. Browser callers already have an executor and should not use it.