Skip to content

Commit e46ac36

Browse files
Ben LeadbetterBenLeadbetter
authored andcommitted
refactor: restructure the workspace
1 parent 9d501ac commit e46ac36

File tree

102 files changed

+192
-52
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

102 files changed

+192
-52
lines changed

Cargo.toml

Lines changed: 3 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,4 @@
1-
[package]
2-
name = "midi2"
3-
version = "0.7.0"
4-
description = "Ergonomic, versatile, strong types wrapping MIDI 2.0 message data."
5-
edition = "2021"
6-
readme = "README.md"
7-
license = "MIT OR Apache-2.0"
8-
authors = [
9-
"Ben Leadbetter <[email protected]>",
10-
]
11-
repository = "https://github.com/midi2-dev/bl-midi2-rs.git"
12-
131
[workspace]
14-
members = [
15-
"midi2_proc",
16-
"fuzz",
17-
]
18-
19-
[lib]
20-
name = "midi2"
21-
path = "src/lib.rs"
22-
23-
[features]
24-
default = ["std", "channel-voice2"]
25-
# wip
26-
ci = ["sysex7"]
27-
flex-data = []
28-
channel-voice1 = []
29-
channel-voice2 = []
30-
std = []
31-
sysex7 = []
32-
sysex8 = []
33-
system-common = []
34-
ump-stream = []
35-
utility = []
36-
37-
[dependencies]
38-
derive_more = { version = "0.99.17", features = ["from"], default-features = false }
39-
fixed = "1.27.0"
40-
midi2_proc = { version = "0.7.0", path = "midi2_proc" }
41-
ux = "0.1.6"
42-
43-
[dev-dependencies]
44-
pretty_assertions = "1.4.0"
45-
static_assertions = "1.1.0"
46-
47-
[package.metadata.docs.rs]
48-
all-features = true
49-
rustdoc-args = ["--cfg", "docsrs"]
2+
members = ["midi2", "midi2_proc", "examples/*", "fuzz"]
3+
default-members = ["midi2"]
4+
resolver = "2"
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "handling_messages"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
midi2 = { path = "../../midi2", default-features = false, features = [
8+
"channel-voice2",
9+
"sysex7",
10+
] }

examples/handling_messages.rs renamed to examples/handling_messages/src/main.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use midi2::prelude::*;
22

33
fn handle_message(buffer: &[u32]) {
44
match UmpMessage::try_from(buffer) {
5-
#[cfg(feature = "channel-voice2")]
65
Ok(UmpMessage::ChannelVoice2(m)) => {
76
println!("Channel Voice2: channel: {}", m.channel());
87
match m {
@@ -23,7 +22,6 @@ fn handle_message(buffer: &[u32]) {
2322
_ => {}
2423
}
2524
}
26-
#[cfg(feature = "sysex7")]
2725
Ok(UmpMessage::Sysex7(m)) => {
2826
println!(
2927
"Sysex 7bit: payload: {:?}",
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "no_std_dynamic_message_generator"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
midi2 = { path = "../../midi2", default-features = false, features = [
8+
"channel-voice1",
9+
"sysex7",
10+
] }
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
#![no_std]
2+
3+
extern crate std;
4+
5+
use midi2::{channel_voice1::*, prelude::*, sysex7::*};
6+
7+
#[derive(Clone, Copy, Debug)]
8+
struct Buffer(*const [u8]);
9+
10+
impl midi2::buffer::Buffer for Buffer {
11+
type Unit = u8;
12+
fn buffer(&self) -> &[Self::Unit] {
13+
unsafe { &*self.0 }
14+
}
15+
}
16+
17+
impl midi2::buffer::BufferTryResize for Buffer {
18+
fn try_resize(&mut self, new_len: usize) -> Result<(), midi2::error::BufferOverflow> {
19+
if new_len < self.0.len() {
20+
return Err(midi2::error::BufferOverflow);
21+
}
22+
Ok(())
23+
}
24+
}
25+
26+
impl midi2::buffer::FromBuffer<&mut [u8]> for Buffer {
27+
fn from_buffer(buffer: &mut [u8]) -> Self {
28+
let ptr: *const u8 = buffer.as_ptr();
29+
let len = buffer.len();
30+
Buffer(core::ptr::slice_from_raw_parts(ptr, len))
31+
}
32+
}
33+
34+
type Message = BytesMessage<Buffer>;
35+
36+
struct MessageIterator<'a> {
37+
messages: &'a [Option<Message>],
38+
index: usize,
39+
}
40+
41+
impl Iterator for MessageIterator<'_> {
42+
type Item = Message;
43+
44+
fn next(&mut self) -> Option<Self::Item> {
45+
if self.index < self.messages.len() {
46+
let index = self.index;
47+
self.index += 1;
48+
Some(*self.messages[index].as_ref().unwrap())
49+
} else {
50+
None
51+
}
52+
}
53+
}
54+
55+
struct Generator {
56+
buffer: [u8; 128],
57+
messages: [Option<Message>; Self::MAX_MESSAGES],
58+
}
59+
60+
impl Generator {
61+
const MAX_MESSAGES: usize = 16;
62+
63+
fn new() -> Self {
64+
Self {
65+
buffer: [0x0; 128],
66+
messages: [None; Self::MAX_MESSAGES],
67+
}
68+
}
69+
70+
fn generate(&mut self) -> Result<MessageIterator, midi2::error::BufferOverflow> {
71+
let mut number_of_messages = 0;
72+
let buffer = &mut self.buffer[..];
73+
74+
// create some channel voice messages
75+
76+
let (message_buffer, buffer) = buffer.split_at_mut(2);
77+
let mut channel_pressure = ChannelPressure::try_new_with_buffer(message_buffer)?;
78+
channel_pressure.set_pressure(u7::new(0x50));
79+
self.messages[number_of_messages] =
80+
Some(ChannelPressure::<Buffer>::rebuffer_from(channel_pressure).into());
81+
number_of_messages += 1;
82+
83+
let (message_buffer, buffer) = buffer.split_at_mut(3);
84+
let mut note_on = NoteOn::try_new_with_buffer(message_buffer)?;
85+
note_on.set_note_number(u7::new(0x38));
86+
note_on.set_velocity(u7::new(0x20));
87+
self.messages[number_of_messages] = Some(NoteOn::<Buffer>::rebuffer_from(note_on).into());
88+
number_of_messages += 1;
89+
90+
let (message_buffer, buffer) = buffer.split_at_mut(3);
91+
let mut control_change = ControlChange::try_new_with_buffer(message_buffer)?;
92+
control_change.set_control(u7::new(0x34));
93+
control_change.set_control_data(u7::new(0x2A));
94+
self.messages[number_of_messages] =
95+
Some(ControlChange::<Buffer>::rebuffer_from(control_change).into());
96+
number_of_messages += 1;
97+
98+
// and a sysex
99+
100+
let (message_buffer, _) = buffer.split_at_mut(22);
101+
let mut sysex = Sysex7::try_new_with_buffer(message_buffer)?;
102+
sysex.try_set_payload((0..20).map(u7::new))?;
103+
self.messages[number_of_messages] = Some(Sysex7::<Buffer>::rebuffer_from(sysex).into());
104+
number_of_messages += 1;
105+
106+
Ok(MessageIterator {
107+
messages: &self.messages[0..number_of_messages],
108+
index: 0,
109+
})
110+
}
111+
}
112+
113+
fn main() {
114+
let mut generator = Generator::new();
115+
for message in generator.generate().unwrap() {
116+
std::println!("{:?}", message);
117+
}
118+
}

fuzz/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ cargo-fuzz = true
1111
libfuzzer-sys = "0.4"
1212

1313
[dependencies.midi2]
14-
path = ".."
14+
path = "../midi2"
1515
default-features = false
1616
features = [
1717
"std",

midi2/Cargo.toml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
[package]
2+
name = "midi2"
3+
version = "0.7.0"
4+
description = "Ergonomic, versatile, strong types wrapping MIDI 2.0 message data."
5+
edition = "2021"
6+
readme = "README.md"
7+
license = "MIT OR Apache-2.0"
8+
authors = [
9+
"Ben Leadbetter <[email protected]>",
10+
]
11+
repository = "https://github.com/midi2-dev/bl-midi2-rs.git"
12+
13+
[dependencies]
14+
derive_more = { version = "0.99.17", features = ["from"], default-features = false }
15+
fixed = "1.27.0"
16+
midi2_proc = { version = "0.7.0", path = "../midi2_proc" }
17+
ux = "0.1.6"
18+
19+
[dev-dependencies]
20+
pretty_assertions = "1.4.0"
21+
static_assertions = "1.1.0"
22+
23+
[package.metadata.docs.rs]
24+
all-features = true
25+
rustdoc-args = ["--cfg", "docsrs"]
26+
27+
[features]
28+
default = ["std", "channel-voice2"]
29+
# wip
30+
ci = ["sysex7"]
31+
flex-data = []
32+
channel-voice1 = []
33+
channel-voice2 = []
34+
std = []
35+
sysex7 = []
36+
sysex8 = []
37+
system-common = []
38+
ump-stream = []
39+
utility = []
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)