[][src]Struct ghakuf::writer::Writer

pub struct Writer<'a> { /* fields omitted */ }

ghakuf's SMF builder.

This builds SMF by Message enums and write out. Message enum consists of MetaEvent, MidiEvent, SysExEvent, and TrackChange. You can use running status if you want. At track change, you should use not only MetaEvent::EndOfTrack message, but also TrackChange message.

Examples

use ghakuf::messages::*;
use ghakuf::writer::*;
use std::path;

let path = path::Path::new("tests/writer_doctest.mid");
let tempo: u32 = 60 * 1000000 / 102; //bpm:102
let mut messages: Vec<Message> = vec![
    Message::MetaEvent {
        delta_time: 0,
        event: MetaEvent::SetTempo,
        data: [(tempo >> 16) as u8, (tempo >> 8) as u8, tempo as u8].to_vec(),
    },
    Message::MetaEvent {
        delta_time: 0,
        event: MetaEvent::EndOfTrack,
        data: Vec::new(),
    },
    Message::TrackChange,
    Message::MidiEvent {
        delta_time: 0,
        event: MidiEvent::NoteOn { ch: 0, note: 0x3c, velocity: 0x7f },
    },
    Message::MidiEvent {
        delta_time: 192,
        event: MidiEvent::NoteOn { ch: 0, note: 0x40, velocity: 0 },
    },
    Message::MetaEvent {
        delta_time: 0,
        event: MetaEvent::EndOfTrack,
        data: Vec::new(),
    }
];

let mut writer = Writer::new();
writer.running_status(true);
for message in &messages {
    writer.push(&message);
}
writer.write(&path);

Methods

impl<'a> Writer<'a>[src]

pub fn new() -> Writer<'a>[src]

Builds Writer with initial value.

Writer's member type initial value
messages Vec<&'a ghakuf::messages::Message> Vec::new()
format ghakuf::formats::Format ghakuf::formats::Format::F1
time_base u16 480
running_status bool false

Examples

use ghakuf::writer::Writer;

let writer: Writer = Writer::new();

pub fn messages(&self) -> &Vec<&'a Message>[src]

Returns keeping messages by borrowing.

Examples

use ghakuf::messages::Message;
use ghakuf::writer::Writer;

let message = Message::TrackChange;
let mut writer: Writer = Writer::new();
writer.push(&message);
assert_eq!(*writer.messages(), vec![&message]);

pub fn push(&mut self, message: &'a Message)[src]

Pushes message to writer.

Examples

use ghakuf::messages::{Message, MidiEvent};
use ghakuf::writer::Writer;

let message = Message::MidiEvent {
    delta_time: 0,
    event: MidiEvent::NoteOn { ch: 0, note: 0x40, velocity: 0 },
};
let mut writer: Writer = Writer::new();
writer.push(&message);

pub fn remove(&mut self, index: usize) -> &'a Message[src]

Removes message from writer.

Examples

use ghakuf::messages::{Message, MetaEvent, MidiEvent};
use ghakuf::writer::Writer;

let mut messages_a: Vec<Message> = vec![
    Message::MidiEvent {
        delta_time: 0,
        event: MidiEvent::NoteOn { ch: 0, note: 0x40, velocity: 0 },
    },
    Message::TrackChange,
    Message::MetaEvent {
        delta_time: 0,
        event: MetaEvent::EndOfTrack,
        data: Vec::new(),
    }
];
let mut writer: Writer = Writer::new();
for message in &messages_a {
    writer.push(&message);
}
writer.remove(1);
assert_eq!(*writer.messages()[0], Message::MidiEvent {
    delta_time: 0,
    event: MidiEvent::NoteOn { ch: 0, note: 0x40, velocity: 0 },
});
assert_eq!(*writer.messages()[1], Message::MetaEvent {
    delta_time: 0,
    event: MetaEvent::EndOfTrack,
    data: Vec::new(),
});

pub fn format(&mut self, format: u16) -> &mut Writer<'a>[src]

Sets SMF format value (Format 0, Format 1 or Format 2) by formats::Format::*.

Examples

use ghakuf::writer::Writer;

let mut writer: Writer = Writer::new();
writer.format(0);

pub fn time_base(&mut self, time_base: u16) -> &mut Writer<'a>[src]

Sets SMF time base value.

Examples

use ghakuf::writer::Writer;

let mut writer: Writer = Writer::new();
writer.time_base(960);

pub fn running_status(&mut self, running_status: bool) -> &mut Writer<'a>[src]

Sets bool value whether you adopt running statusor not.

Examples

use ghakuf::writer::Writer;

let mut writer: Writer = Writer::new();
writer.running_status(true);

pub fn write(&self, path: &Path) -> Result<(), Error>[src]

Writes out SMF messages you stored.

Examples

use ghakuf::messages::*;
use ghakuf::writer::*;
use std::path;

let path = path::Path::new("tests/writer_write_doctest.mid");
let tempo: u32 = 60 * 1000000 / 102; //bpm:102
let mut messages: Vec<Message> = vec![
    Message::MetaEvent {
        delta_time: 0,
        event: MetaEvent::SetTempo,
        data: [(tempo >> 16) as u8, (tempo >> 8) as u8, tempo as u8].to_vec(),
    },
    Message::MetaEvent {
        delta_time: 0,
        event: MetaEvent::EndOfTrack,
        data: Vec::new(),
    },
    Message::TrackChange,
    Message::MidiEvent {
        delta_time: 0,
        event: MidiEvent::NoteOn { ch: 0, note: 0x3c, velocity: 0x7f },
    },
    Message::MetaEvent {
        delta_time: 0,
        event: MetaEvent::EndOfTrack,
        data: Vec::new(),
    }
];

let mut writer = Writer::new();
for message in &messages {
    writer.push(&message);
}
writer.write(&path);

Auto Trait Implementations

impl<'a> Send for Writer<'a>

impl<'a> Sync for Writer<'a>

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T[src]

impl<T, U> TryFrom for T where
    U: Into<T>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]