mirror of
https://github.com/italicsjenga/agb.git
synced 2024-12-23 08:11:33 +11:00
Boilerplate for midi support
This commit is contained in:
parent
0975530e5c
commit
797fc8394f
22
tracker/agb-midi-core/Cargo.toml
Normal file
22
tracker/agb-midi-core/Cargo.toml
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
[package]
|
||||||
|
name = "agb_midi_core"
|
||||||
|
version = "0.18.0"
|
||||||
|
authors = ["Gwilym Inzani <gw@ilym.me>"]
|
||||||
|
edition = "2021"
|
||||||
|
license = "MPL-2.0"
|
||||||
|
description = "Library for converting MIDI files for use with agb-tracker on the Game Boy Advance. You shouldn't use this package directly"
|
||||||
|
repository = "https://github.com/agbrs/agb"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
proc-macro-error = "1"
|
||||||
|
proc-macro2 = "1"
|
||||||
|
quote = "1"
|
||||||
|
syn = "2"
|
||||||
|
rustysynth = "1.3"
|
||||||
|
midly = { version = "0.5", default-features = false, features = [
|
||||||
|
"alloc",
|
||||||
|
"std",
|
||||||
|
] }
|
||||||
|
|
||||||
|
agb_tracker_interop = { version = "0.18.0", path = "../agb-tracker-interop" }
|
||||||
|
agb_fixnum = { version = "0.18.0", path = "../../agb-fixnum" }
|
70
tracker/agb-midi-core/src/lib.rs
Normal file
70
tracker/agb-midi-core/src/lib.rs
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
use std::{error::Error, path::Path};
|
||||||
|
|
||||||
|
use proc_macro2::TokenStream;
|
||||||
|
use proc_macro_error::abort;
|
||||||
|
use quote::quote;
|
||||||
|
use syn::{
|
||||||
|
parse::{Parse, ParseStream},
|
||||||
|
LitStr, Token,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MidiCoreInput {
|
||||||
|
sf2_file: LitStr,
|
||||||
|
comma: Token![,],
|
||||||
|
midi_file: LitStr,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Parse for MidiCoreInput {
|
||||||
|
fn parse(input: ParseStream) -> syn::Result<Self> {
|
||||||
|
Ok(Self {
|
||||||
|
sf2_file: input.parse()?,
|
||||||
|
comma: input.parse()?,
|
||||||
|
midi_file: input.parse()?,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn agb_midi_core(args: TokenStream) -> TokenStream {
|
||||||
|
let input: MidiCoreInput = match syn::parse2(args.clone()) {
|
||||||
|
Ok(input) => input,
|
||||||
|
Err(e) => abort!(args, e),
|
||||||
|
};
|
||||||
|
|
||||||
|
let sf2_file = input.sf2_file.value();
|
||||||
|
let midi_file = input.midi_file.value();
|
||||||
|
|
||||||
|
let root = std::env::var("CARGO_MANIFEST_DIR").expect("Failed to get cargo manifest dir");
|
||||||
|
let sf2_file = Path::new(&root).join(&*sf2_file);
|
||||||
|
let midi_file = Path::new(&root).join(&*midi_file);
|
||||||
|
|
||||||
|
let sf2_include_path = sf2_file.to_string_lossy();
|
||||||
|
let midi_file_include_path = midi_file.to_string_lossy();
|
||||||
|
|
||||||
|
let midi_info = match MidiInfo::load_from_file(&sf2_file, &midi_file) {
|
||||||
|
Ok(track) => track,
|
||||||
|
Err(e) => abort!(args, e),
|
||||||
|
};
|
||||||
|
|
||||||
|
let parsed = parse_midi(&midi_info);
|
||||||
|
|
||||||
|
quote! {
|
||||||
|
{
|
||||||
|
const _: &[u8] = include_bytes!(#sf2_include_path);
|
||||||
|
const _: &[u8] = include_bytes!(#midi_file_include_path);
|
||||||
|
|
||||||
|
#parsed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct MidiInfo {}
|
||||||
|
|
||||||
|
impl MidiInfo {
|
||||||
|
pub fn load_from_file(sf2_file: &Path, midi_file: &Path) -> Result<Self, Box<dyn Error>> {
|
||||||
|
Ok(Self {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn parse_midi(midi_info: &MidiInfo) -> TokenStream {
|
||||||
|
quote! {}
|
||||||
|
}
|
16
tracker/agb-midi/Cargo.toml
Normal file
16
tracker/agb-midi/Cargo.toml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[package]
|
||||||
|
name = "agb_midi"
|
||||||
|
version = "0.18.0"
|
||||||
|
authors = ["Gwilym Inzani <gw@ilym.me>"]
|
||||||
|
edition = "2021"
|
||||||
|
license = "MPL-2.0"
|
||||||
|
description = "Library for converting MIDI files for use with agb-tracker on the Game Boy Advance. You shouldn't use this package directly"
|
||||||
|
repository = "https://github.com/agbrs/agb"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
proc-macro = true
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
agb_midi_core = { version = "0.18.0", path = "../agb-midi-core" }
|
||||||
|
proc-macro-error = "1"
|
||||||
|
proc-macro2 = "1"
|
8
tracker/agb-midi/src/lib.rs
Normal file
8
tracker/agb-midi/src/lib.rs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
use proc_macro::TokenStream;
|
||||||
|
use proc_macro_error::proc_macro_error;
|
||||||
|
|
||||||
|
#[proc_macro_error]
|
||||||
|
#[proc_macro]
|
||||||
|
pub fn include_xm(args: TokenStream) -> TokenStream {
|
||||||
|
agb_midi_core::agb_midi_core(args.into()).into()
|
||||||
|
}
|
|
@ -8,10 +8,12 @@ description = "Library for playing tracker music. Designed for use with the agb
|
||||||
repository = "https://github.com/agbrs/agb"
|
repository = "https://github.com/agbrs/agb"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["xm"]
|
default = ["xm", "midi"]
|
||||||
xm = ["dep:agb_xm"]
|
xm = ["dep:agb_xm"]
|
||||||
|
midi = ["dep:agb_midi"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
agb_midi = { version = "0.18.1", path = "../agb-midi", optional = true }
|
||||||
agb_xm = { version = "0.18.1", path = "../agb-xm", optional = true }
|
agb_xm = { version = "0.18.1", path = "../agb-xm", optional = true }
|
||||||
agb = { version = "0.18.1", path = "../../agb" }
|
agb = { version = "0.18.1", path = "../../agb" }
|
||||||
agb_tracker_interop = { version = "0.18.1", path = "../agb-tracker-interop", default-features = false }
|
agb_tracker_interop = { version = "0.18.1", path = "../agb-tracker-interop", default-features = false }
|
||||||
|
|
Loading…
Reference in a new issue