Code Search for Developers
 
 
  

datmidi.c from Allegro game programming library at Krugle


Show datmidi.c syntax highlighted

/*         ______   ___    ___ 
 *        /\  _  \ /\_ \  /\_ \ 
 *        \ \ \L\ \\//\ \ \//\ \      __     __   _ __   ___ 
 *         \ \  __ \ \ \ \  \ \ \   /'__`\ /'_ `\/\`'__\/ __`\
 *          \ \ \/\ \ \_\ \_ \_\ \_/\  __//\ \L\ \ \ \//\ \L\ \
 *           \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
 *            \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
 *                                           /\____/
 *                                           \_/__/
 *
 *      Grabber plugin for managing AL_MIDI objects.
 *
 *      By Shawn Hargreaves.
 *
 *      See readme.txt for copyright information.
 */


#include <stdio.h>

#include "allegro.h"
#include "allegro/internal/aintern.h"
#include "../datedit.h"



/* creates a new AL_MIDI object */
static void *makenew_midi(long *size)
{
   AL_MIDI *mid;
   int c;

   mid = _al_malloc(sizeof(AL_MIDI));
   mid->divisions = 120;

   for (c=0; c<AL_MIDI_TRACKS; c++) {
      mid->track[c].data = NULL;
      mid->track[c].len = 0;
   }

   return mid;
}



/* displays a AL_MIDI file in the grabber object view window */
static void plot_midi(AL_CONST AL_DATAFILE *dat, int x, int y)
{
   al_put_text(al_screen, al_font_8x8, "Double-click in the item list to play it", x, y+32, al_gui_fg_color);
}



/* handles double-clicking on a AL_MIDI file in the grabber */
static int dclick_midi(AL_DATAFILE *dat)
{
   al_play_midi(dat->dat, FALSE);
   return D_O_K;
}



/* exports a AL_MIDI object into an external file */
static int export_midi(AL_CONST AL_DATAFILE *dat, AL_CONST char *filename)
{
   AL_MIDI *midi = (AL_MIDI *)dat->dat;
   AL_PACKFILE *f;
   int num_tracks;
   int c;

   num_tracks = 0;
   for (c=0; c<AL_MIDI_TRACKS; c++)
      if (midi->track[c].len > 0)
	 num_tracks++;

   f = al_pack_fopen(filename, F_WRITE);

   if (f) {
      pack_fputs("MThd", f);                 /* AL_MIDI header */
      pack_mputl(6, f);                      /* size of header chunk */
      pack_mputw(1, f);                      /* type 1 */
      pack_mputw(num_tracks, f);             /* number of tracks */
      pack_mputw(midi->divisions, f);        /* beat divisions */

      for (c=0; c<AL_MIDI_TRACKS; c++) {        /* for each track */
	 if (midi->track[c].len > 0) {
	    pack_fputs("MTrk", f);           /* write track data */
	    pack_mputl(midi->track[c].len, f); 
	    pack_fwrite(midi->track[c].data, midi->track[c].len, f);
	 }
      }

      pack_fclose(f);
   }

   return (errno == 0);
}



/* imports a AL_MIDI object from an external file */
static void *grab_midi(AL_CONST char *filename, long *size, int x, int y, int w, int h, int depth)
{
   return al_load_midi(filename);
}



/* saves a AL_MIDI object in the datafile format */
static void save_midi(AL_DATAFILE *dat, int packed, int packkids, int strip, int verbose, int extra, AL_PACKFILE *f)
{
   AL_MIDI *midi = (AL_MIDI *)dat->dat;
   int c;

   pack_mputw(midi->divisions, f);

   for (c=0; c<AL_MIDI_TRACKS; c++) {
      pack_mputl(midi->track[c].len, f);
      if (midi->track[c].len > 0)
	 pack_fwrite(midi->track[c].data, midi->track[c].len, f);
   }
}



/* plugin interface header */
DATEDIT_OBJECT_INFO datmidi_info =
{
   DAT_MIDI, 
   "AL_MIDI file", 
   NULL,
   makenew_midi,
   save_midi,
   plot_midi,
   dclick_midi,
   NULL
};



DATEDIT_GRABBER_INFO datmidi_grabber =
{
   DAT_MIDI, 
   "mid",
   "mid",
   grab_midi,
   export_midi
};






See more files for this project here

Allegro game programming library

Allegro is a cross-platform library intended for use in computer games and other types of multimedia programming.

Project homepage: http://sourceforge.net/projects/alleg
Programming language(s): Assembly,C,Shell Script
License: other

  datalpha.c
  datalpha.inc
  datfli.c
  datfli.inc
  datfont.c
  datfont.inc
  datgrab.c
  datgrab.inc
  datgrid.c
  datgrid.inc
  datimage.c
  datimage.inc
  datitype.c
  datitype.inc
  datmidi.c
  datmidi.inc
  datpal.c
  datpal.inc
  datsamp.c
  datsamp.inc
  datworms.c
  datworms.inc
  plugins.txt