[PD-cvs] SF.net SVN: pure-data: [9559] trunk/externals/mrpeach/midifile/midifile.c
mrpeach at users.sourceforge.net
mrpeach at users.sourceforge.net
Tue Mar 11 18:03:40 CET 2008
Revision: 9559
http://pure-data.svn.sourceforge.net/pure-data/?rev=9559&view=rev
Author: mrpeach
Date: 2008-03-11 10:03:38 -0700 (Tue, 11 Mar 2008)
Log Message:
-----------
Changed "write" message to include frame per second and ticks per frame.
Modified Paths:
--------------
trunk/externals/mrpeach/midifile/midifile.c
Modified: trunk/externals/mrpeach/midifile/midifile.c
===================================================================
--- trunk/externals/mrpeach/midifile/midifile.c 2008-03-11 13:22:25 UTC (rev 9558)
+++ trunk/externals/mrpeach/midifile/midifile.c 2008-03-11 17:03:38 UTC (rev 9559)
@@ -100,7 +100,7 @@
static void midifile_flush(t_midifile *x);
static size_t midifile_write_header(t_midifile *x);
static void midifile_read(t_midifile *x, t_symbol *path);
-static void midifile_write(t_midifile *x, t_symbol *path);
+static void midifile_write(t_midifile *x, t_symbol *s, int argc, t_atom *argv);
static void midifile_bang(t_midifile *x);
static size_t midifile_write_end_of_track(t_midifile *x, size_t end_time);
static void midifile_float(t_midifile *x, t_float ticks);
@@ -124,7 +124,7 @@
class_addlist(midifile_class, midifile_list);
class_addmethod(midifile_class, (t_method)midifile_read, gensym("read"), A_DEFSYMBOL, 0);
class_addmethod(midifile_class, (t_method)midifile_flush, gensym("flush"), 0);
- class_addmethod(midifile_class, (t_method)midifile_write, gensym("write"), A_DEFSYMBOL, 0);
+ class_addmethod(midifile_class, (t_method)midifile_write, gensym("write"), A_GIMME, 0);
class_addmethod(midifile_class, (t_method)midifile_dump, gensym("dump"), A_DEFFLOAT, 0);
class_addmethod(midifile_class, (t_method)midifile_single_track, gensym("track"), A_DEFFLOAT, 0);
class_addmethod(midifile_class, (t_method)midifile_rewind, gensym("rewind"), 0);
@@ -326,11 +326,30 @@
return written;
}
-static void midifile_write(t_midifile *x, t_symbol *path)
+static void midifile_write(t_midifile *x, t_symbol *s, int argc, t_atom *argv)
/* open the file for writing and write the header */
{
+ char *path;
+ int frames_per_second = 0;/* default */
+ int ticks_per_frame = 90; /* default*/
+
+ if ((argc >= 1) && (argv[0].a_type == A_SYMBOL)) path = argv[0].a_w.w_symbol->s_name;
+ else pd_error(x, "midifile_write: No valid path name");
+ if (argc == 2)
+ {
+ if (argv[1].a_type == A_FLOAT) ticks_per_frame = (int)argv[1].a_w.w_float;
+ else pd_error (x, "midifile_write: second argument is not a float");
+ }
+ else if (argc >= 3) /* ignore extra arguments */
+ {
+ if (argv[2].a_type == A_FLOAT) ticks_per_frame = (int)argv[2].a_w.w_float;
+ else pd_error (x, "midifile_write: third argument is not a float");
+ if (argv[1].a_type == A_FLOAT) frames_per_second = (int)argv[1].a_w.w_float;
+ else pd_error (x, "midifile_write: second argument is not a float");
+ }
+ post("midifile_write: path = %s, fps = %d, tpf = %d", path, frames_per_second, ticks_per_frame);
midifile_free_file(x);
- if (midifile_open_path(x, path->s_name, "wb"))
+ if (midifile_open_path(x, path, "wb"))
{
if (x->verbosity) post("midifile: opened %s", x->fPath);
x->state = mfWriting;
@@ -340,12 +359,12 @@
x->header_chunk.chunk_length = 6L; /* 3 ints to follow */
x->header_chunk.chunk_format = 0; /* single-track file */
x->header_chunk.chunk_ntrks = 1; /* one track for type 0 file */
- x->header_chunk.chunk_division = 90; /* for now */
+ x->header_chunk.chunk_division = (((-frames_per_second)<<8)|ticks_per_frame);
strncpy (x->track_chunk[0].chunk_type, "MTrk", 4L);
x->track_chunk[0].chunk_length = 0L; /* for now */
midifile_rewind_tracks(x);
}
- else error("midifile: Unable to open %s", path->s_name);
+ else pd_error(x, "midifile_write: Unable to open %s", path);
}
static void midifile_read(t_midifile *x, t_symbol *path)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Pd-cvs
mailing list