# Pieces-O-MIDI # # Read a MIDI File, split it up into n pieces, and sequence the pieces # by using the pitch values of the notes in the original music to # select which pieces to use. The "offset" value is something you can # use to adjust the pitch values, causing it to select different sections # of the piece (ie. if you split it into 1000 pieces, you don't want to # be limited to picking only pieces 0-127) function pieces(fname,n,offset,mult) { if ( offset == "" ) offset = 0 f = readmf(fname) f.length = latest(f) if ( f.length <= n ) { print("That file is too short to split into ",n," pieces!") return() } arr = cutitup(f,n) p = seqpieces(arr,f,offset,mult) writemf(p,"www.mid") writelines(p,"www.lines") } # Sequence from the pieces in the arr array function seqpieces(arr,p,offset,mult) { npieces = sizeof(arr) r = '' for ( n in onlynotes(p) ) { i = ((n.pitch*mult) + offset) % npieces r += arr[i] if ( r.length >= p.length ) break; } return(r) } # Cut a phrase up into "np" pieces function cutitup(p,np) { arr = [] # Here we try to figure out a reasonable size for the pieces s1 = p.length / np if ( s1 <= 0 ) { s1 = 1 } qnt = 2b sectsize = numquant( s1 , qnt ) while ( sectsize <= 0 ) { qnt /= 2 if ( qnt == 0 ) { print("Bad news in resection!? p.length=",p.length," np=",np," s1=",s1," qnt=",qnt) break } sectsize = numquant( s1 , qnt ) } # Now split it up nsect = p.length / sectsize for ( n=0; n < nsect; n++ ) { p2 = cut(p,CUT_TIME,n*sectsize,(n+1)*sectsize) p2 -= nonnotes(p2) p2.time -= numquant(p2%1.time,sectsize) if ( p2%1.time < 0 ) p2.time += sectsize p2.length = sectsize arr[n] = p2 } return(arr) }