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

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]

[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();

[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]);

[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);

[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(),
});

[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);

[src]

Sets SMF time base value.

Examples

use ghakuf::writer::Writer;

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

[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);

[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);