home *** CD-ROM | disk | FTP | other *** search
- /* transcribe.c -- keyboard to adagio recorder */
-
- /*****************************************************************************
- * Change Log
- * Date | Change
- *-----------+-----------------------------------------------------------------
- * 23-Feb-86 | Created changelog
- * | Use pedal information when computing durations
- * 5-May-86 | Changed data structure for speed
- * 21-May-86 | Use record.c to implement record functions
- * 26-May-86 | Incorporate cmdline.c
- * 6-Aug-86 | Adapted to Lattice V3.00
- *****************************************************************************/
-
- #include "cext.h"
- #include "stdio.h"
- #include "cmdline.h"
- #include "mpu.h"
- #include "userio.h"
- #include "record.h"
-
- #define STOP_CC 1
- #define STOP_CBRK 2
- #define STOP_KEY 3
- #define STOP_SPACE 4
-
- #define num_voices 16
-
- #define stop_code ' '
- char stop_explanation[] = "Space bar";
-
- extern int musictrace;
- extern int miditrace;
- extern int CBREAK;
- extern int debug_intr;
- extern int debug_rec;
- boolean poll = false; /* true if poll, false if interrupt */
-
- #define nswitches 8
- char *switches[nswitches] =
- { "-debug", "-d", "-help", "-miditrace", "-m", "-trace", "-t", "-block" };
-
- #define noptions 3
- char *options[noptions] = { "-c", "-control", "-tune" };
-
- /****************************************************************************
- * Routines local to this module
- ****************************************************************************/
- private void cmdline_help();
- private boolean stop_check();
-
- /****************************************************************************
- * cmdline_help
- * Effect:
- * Prints out command line help
- ****************************************************************************/
-
- private void cmdline_help()
- {
- fprintf(stderr,"transcri [options] filename [options]\n");
- fprintf(stderr," Options are below.\n");
- fprintf(stderr," -block disable MIDI thru\n");
- fprintf(stderr," -control (-c) on record control info\n");
- fprintf(stderr," -control (-c) off do not record control info\n");
- fprintf(stderr," -debug (-d) enable verbose debug mode\n");
- fprintf(stderr," -help this message\n");
- fprintf(stderr," -miditrace (-m) turn on MIDI command trace\n");
- fprintf(stderr," -trace (-t) trace music\n");
- }
-
- /****************************************************************
- * main
- * Effect:
- * transcribe from keyboard
- ****************************************************************/
-
- void main(argc,argv)
- int argc;
- char *argv[];
- {
- long time; /* current time */
- boolean done = false; /* set when recording is finished */
- int stop_reason; /* reason recording is finished */
- char score_na[100]; /* score name */
- int i; /* used to scan command line */
- char *strptr; /* string pointer used to get file name */
- int ctrlflag; /* record control info? */
-
- score_na[0] = 0; /* null string */
-
- cl_init(switches, nswitches, options, noptions, argv, argc);
-
- if (cl_switch("-help")) {
- cmdline_help();
- return;
- }
-
- if ((strptr = cl_arg(1)) != NULL)
- strcpy(score_na, strptr);
-
- if ((strptr = cl_noption(options, noptions)) != NULL) {
- ctrlflag = (strcmp(strptr, "on") == 0);
- } else {
- ctrlflag = askbool("Pitch bend, etc. on", false);
- }
- musicinit();
-
- /* reset all channels to MIDI program 1: */
- for (i = 0; i < num_voices; i++) {
- midi_program(i, 1);
- }
-
- if (!rec_init(score_na, ctrlflag)) {
- printf("No space for recording, use a smaller adagio file.\n");
- musicterm();
- exit(1);
- }
-
- printf("Transcribe ready. Type space bar to stop.\n");
-
- timereset();
- while (!done) {
- time = gettime()/* delay everything by offset */;
- if (rec_poll(time)) { /* record anything that's there */
- done = true;
- stop_reason = STOP_SPACE;
- }
- if (CBREAK || kbhit()) {
- done |= stop_check(&stop_reason);
- }
- mpu_error_check(); /* look for buffer overflow */
- }
- rec_final(false); /* write out recorded data, */
- /* suppress time of first event*/
- musicterm();
- }
-
- /****************************************************************************
- * stop_check
- * Outputs:
- * *reason is set to reason for stop
- * true is returned iff play should stop
- * Effect:
- * Checks for break character or stop code from kbd
- ****************************************************************************/
-
- private boolean stop_check(reason)
- int *reason;
- {
- boolean done = false;
- switch(CBREAK) { /* stop reason */
- case 0: /* no stop code, try keyboard */
- done = (getch() == stop_code);
- if (done) *reason = STOP_KEY;
- break;
- case 1: /* ctrl-break */
- done = true;
- if (kbhit()) getch();
- *reason = STOP_CBRK;
- break;
- case 2: /* ctrl-C */
- done = true;
- *reason = STOP_CC;
- if (kbhit()) getch();
- break;
- } /* stop reason */
- return done;
- }
-