void Alg_smf_write::write_update(Alg_update_ptr update) { char *name = update->parameter.attr_name(); /****Non-Meta Events****/ if (!strcmp(name, "pressurer")) { write_delta(update->time); if (update->get_identifier() < 0) { // channel pressure message out_file->put(0xD0 + to_midi_channel(update->chan)); write_data((int)(update->parameter.r * 127)); } else { // just 1 key -- poly pressure out_file->put(0xA0 + to_midi_channel(update->chan)); write_data(update->get_identifier()); write_data((int)(update->parameter.r * 127)); } } else if (!strcmp(name, "programi")) { write_delta(update->time); out_file->put(0xC0 + to_midi_channel(update->chan)); write_data(update->parameter.i); } else if (!strcmp(name, "bendr")) { int temp = ROUND(0x2000 * (update->parameter.r + 1)); if (temp > 0x3fff) temp = 0x3fff; // 14 bits maximum if (temp < 0) temp = 0; int c1 = temp & 0x7F; // low 7 bits int c2 = temp >> 7; // high 7 bits write_delta(update->time); out_file->put(0xE0 + to_midi_channel(update->chan)); write_data(c1); write_data(c2); } else if (!strncmp(name, "control", 7) &&
void Alg_seq::write(ostream &file, bool in_secs) { int i, j; if (in_secs) convert_to_seconds(); else convert_to_beats(); Alg_event_ptr update_to_skip = write_track_name(file, 0, track_list[0]); Alg_beats &beats = time_map->beats; for (i = 0; i < beats.len - 1; i++) { Alg_beat_ptr b = &(beats[i]); if (in_secs) { file << "T" << TIMFMT << b->time; } else { file << "TW" << TIMFMT << b->beat / 4; } double tempo = (beats[i + 1].beat - b->beat) / (beats[i + 1].time - beats[i].time); file << " -tempor:" << GFMT << tempo * 60 << "\n"; } if (time_map->last_tempo_flag) { // we have final tempo: Alg_beat_ptr b = &(beats[beats.len - 1]); if (in_secs) { file << "T" << TIMFMT << b->time; } else { file << "TW" << TIMFMT << b->beat / 4; } file << " -tempor:" << GFMT << time_map->last_tempo * 60.0 << "\n"; } // write the time signatures for (i = 0; i < time_sig.length(); i++) { Alg_time_sig &ts = time_sig[i]; double time = ts.beat; if (in_secs) { file << "T" << TIMFMT << time << " V- -timesig_numr:" << GFMT << ts.num << "\n"; file << "T" << TIMFMT << time << " V- -timesig_denr:" << GFMT << ts.den << "\n"; } else { double wholes = ts.beat / 4; file << "TW" << TIMFMT << wholes << " V- -timesig_numr:" << GFMT << ts.num << "\n"; file << "TW" << TIMFMT << wholes << " V- -timesig_denr:" << GFMT << ts.den << "\n"; } } for (j = 0; j < track_list.length(); j++) { Alg_events ¬es = track_list[j]; if (j != 0) update_to_skip = write_track_name(file, j, notes); // now write the notes at beat positions for (i = 0; i < notes.length(); i++) { Alg_event_ptr e = notes[i]; // if we already wrote this event as a track or sequence name, // do not write it again if (e == update_to_skip) continue; double start = e->time; if (in_secs) { file << "T" << TIMFMT << start; } else { file << "TW" << TIMFMT << start / 4; } // write the channel as Vn or V- if (e->chan == -1) file << " V-"; else file << " V" << e->chan; // write the note or update data if (e->is_note()) { Alg_note_ptr n = (Alg_note_ptr) e; double dur = n->dur; file << " K" << n->get_identifier() << " P" << GFMT << n->pitch; if (in_secs) { file << " U" << TIMFMT << dur; } else { file << " Q" << TIMFMT << dur; } file << " L" << GFMT << n->loud; Alg_parameters_ptr p = n->parameters; while (p) { parameter_print(file, &(p->parm)); p = p->next; } } else { // an update assert(e->is_update()); Alg_update_ptr u = (Alg_update_ptr) e; if (u->get_identifier() != -1) { file << " K" << u->get_identifier(); } parameter_print(file, &(u->parameter)); } file << "\n"; } } }