/* Copyright (c) 2002-2004 by Stanley M. Swanson. Distributed under the GNU General Public License, version 2 (GPL v2). */ /* vamp_loops.c from midivamp.c 035.26 */ # include "globals.h" # if (0) void print_help(void) /* print contents of help[] */ { int i; for (i=0; i0) /* initialize loops */ { lix--; loop = loopaddr[lix]; varptr = loop_ptr[lix]; if (loop[0]) { loop[2] = loop[3]; *varptr = loop[2]; } else { loop[2] = 0; *varptr = loop[3]; } if (Q_VERBOSE>6 && V_CLASS==6) printf("init lix %d ix %d value %4d\n",lix,loop[2],*varptr); } /* while (lix>0) initialize */ /* slow loop midi changes... */ if (lixin>2) { meas = tictoc = previ = 0; chan = 0; drum = 0; prog = which - 1; /* program is external instrument - 1 */ if (which>127){ chan = 9; drum = which - 100; prog = 0; if (drum<35) drum = 35; if (drum>81) drum = 81; } /* Timidity drums play on channel 9, tones 35 - 81 coded as instruments 135...181 in this program */ delta(0); change(0xC,chan,prog); /* instrument */ } n = loop[2] + 3; /* index into tone_list, veloc_list parallel to rhythm_list */ previ = tictoc/quantum; tone = tone_list[n] + key; /* default key of C */ if (drum) tone = drum; /* percussion */ vol = veloc_list[n]; if (vol>1000) { k = vol / 1000; vol -= k*1000; /* strip accent markers: 2000==primary, 1000==secondary */ if (k==2) vol += accent; if (k==1) vol += accent/2; if (vol>127) vol = 127; } /* if (vol>1000) */ tictoc += dur; if (Q_VERBOSE>1 && V_CLASS==6) printf(" tone %3d vol %3d duration %3d loop %d instrument %3d\n", tone, vol, dur, lid, which); delta(0); command(0x9,chan,tone,vol); delta(dur); command(0x8,chan,tone,0); # if (0) if (vol>=0) { /* start and stop note or rest */ delta(0); command(0x9,chan,tone,vol); delta(dur); command(0x8,chan,tone,0); } if (vol == (-1) ) /* measure bar seen */ { if (tictoc>0 && Q_VERBOSE>1 && V_CLASS==6) printf("measure %3d notes %4d duration %4d nout %5d\n", meas,previ,tictoc,nout); meas++; accent += 0; tictoc = 0; } /* for (n...npitch) music loop */ # endif /* iterate and check limits */ lixin = lix - 1; while (lix>lixin) { lixin = lix; if (Q_VERBOSE>6 && V_CLASS==6) printf("incr lix %d ix %d value %4d\n",lix,loop[2],*varptr); if (loop[0]) { loop[2] += loop[5]; if (loop[2]=lmax) { lix = lmax + 1; break; } /* final escape */ if (lix>0) { loop = loopaddr[lix]; varptr = loop_ptr[lix]; } if (Q_VERBOSE>6 && V_CLASS==6) printf("incr end lix %d value ix %d %4d\n",lix,loop[2],*varptr); } /* while (lix>lixin) */ } /* while (lix<=lmax) */ delta(100); shout(0xFF2F); delta(0); /* end of track */ if (fout) { fwrite(mtrk,1,4,fout); i = nout; lowendian(4,(char*)&i,i4); fwrite(i4,1,4,fout); fwrite(bout,1,nout,fout); fclose(fout); } printf(" command trk length %d hex %x oct %o \n",nout,nout,nout); } void session_prefix(void) { int ncs; time_t now; char buf[60]; printf("log file (and loop output prefix): "); dot_sess = ncs = finstring(session,50,stdin); commenta[0] = commentb[0] = kc = 0; if (ncs>0) { /* loops to study options print_help(); */ session[ncs] = '.'; session[ncs+1] = 'l'; session[ncs+2] = 'o'; session[ncs+3] = 'g'; session[ncs+4] = 0; flog = fopen(session,"r"); if (flog) { printf("existing session prefix... open append\n"); fclose(flog); flog = fopen(session,"a"); } else flog = fopen(session,"w"); if (flog) { now = time(NULL); strftime(buf,60,"%H:%M:%S on %A, %d %B %Y",localtime(&now)); printf("opened log file: %s \n",session); fprintf(flog,"===== opened %s\n",buf); } else printf("log file not opened\n"); session[ncs+4] = '.'; session[ncs+5] = 'm'; session[ncs+6] = 'i'; session[ncs+7] = 'd'; session[ncs+8] = 0; } /* prepare for sequence number midi_out_number in session[ncs:ncs+3] */ at_file = 0; fin[at_file] = stdin; } /* session_prefix() */ int loop_in(void) { int j,k,m,n, in_at = at_file, ncs = dot_sess; char *data=line+lch+2, *token, *file; copy_line(); token = data = file = NULL; token = find_token(&tok_start); lch = tok_start - token_buf; if (!token) return; data = line + lch; file = find_token(&tok_start); switch(token[0]) { case '?': print_help(); break; case '#': if (commenta[0]==0) strcpy(commenta,line); else if (commentb[0]==0) strcpy(commentb,line); break; /* comment */ /* case '@': filin = new_file(line+1,"r"); k = stack_files(filin); break; */ case 'g': sprintf(session+ncs,"%4d",ksession+1000); session[ncs]='.'; ksession++; if (file) { generate_loops(file); spawn_play(file); } else { generate_loops(session); spawn_play(session); } commenta[0] = commentb[0] = kc = 0; break; case 'p': if (file) spawn_play(file); break; /* case pid>0 continue execution in parent */ /* case 'q': exit(0); */ /* quit program */ case 'a': scan_list(accent_list,data); break; case 'c': scan_list(controls[kc],data); if (kc<9) kc++; break; case 'i': scan_list(instrument_list,data); break; case 'k': scan_list(key_list,data); break; case 'l': scan_list(loop_list,data); break; case 'o': k = 0; for (j=lch+2; j (-1)) { order_list[k+3] = m; k++; } } if (k<1) printf("no loops in order_list...keep old\n"); else order_list[1] = k; break; case 'r': scan_list(rhythm_list,data); break; case 't': scan_list(tone_list,data); break; case 'v': scan_list(veloc_list,data); break; case 'd': printf("dump unimplemented\n"); case '%': break; /* just a comment */ case 0: break; default: printf("unhandled loop option %s\n",line); } /* switch (line[0]) */ /* } */ /* while (1) */ } /* end loop_in() */