# Midipiano.rb # 9 Dec 2018 # Use a midi keyboard to play a piano tune and record it # Use midi key :C2 to end recording and play the tune from recorded arrays # reference code used to build this program # https://github.com/samaaron/sonic-pi/blob/master/etc/doc/tutorial/11.1-MIDI-In.md # This Gist by Robin Newman shows how to add computer keyboard control # via a Ruby script and # TCP socket I hope to add this technique to this program and # use an HTML page instead of the computer keyboard. # https://www.youtube.com/watch?v=uM4hEw4kju4&feature=youtube # https://gist.github.com/rbnpi/7e01964ab8110e6df1e6d823bd9c4dcb def midi2note(n) nn=note(n) if nn==nil # puts "nil seen",nn return nn else nn= note_info(nn) # puts nn nnn=nn.to_s.split(":") # puts nnn mmm= nnn.chop return mmm end end # midi2note def midichord2note(m) # chords in midi aren't handled well puts m i=0 sss='' while i<m.length sss=sss+midi2note(m[i])+',' i+=1 end return sss end sst= ssv= svt= live_loop :midi_piano do use_real_time #puts tick,vt note, velocity = sync "/midi/q49/0/1/note_on" #Use :C2 (37) to end recording and start playback if (note<37) puts "saveit" svt.push(vt) # quantize? i=0 while i<svt.length-1 svt[i]=svt[i+1]-svt[i] puts 'svt ',i,svt[i] i+=1 end i=0 while i<sst.length use_synth :piano play sst[i],amp:ssv[i]/127.0 # sleep 0.25 sleep svt[i] i+=1 end end sst.push(note) ssv.push(velocity) svt.push(vt) puts midichord2note(sst) #synth :piano, note: note synth :piano, note: note, amp: velocity / 127.0 end
that’s very interesting a works surprisingly good! Thanks!
I have been thinking (and did some first attempts) to do that. The interesting issue is hidden in your comment:
#quantize. Sooner or later I would like to not only record live sound but also (quantized) Midi input.
So I’ll try to build on your work and go on with these ideas.
Seeing the reference to my previous code written in 2016 spurred me on to update it, as you can see here
This lets you playback from tracks and record on another one.
The editor has a quantize feature.
Save as a Midi file
You can open the midi file in Musescore and see, edit, play and export the sheet music.
Use the 2.0 version for now 3.0 has just been released and has some problems.
A plug-in (with MS2) that will output a text file of duration and pitch/rest data allows you to pull that info into Sonic Pi. Or you can take the notes and durations in Sonic Pi and build the text file that Musescore with the plugin can read. Look at the .rb programs