From 93d31d76d52472da883af4f913b9ad3571009643 Mon Sep 17 00:00:00 2001 From: Markus Schmidt Date: Mon, 12 Mar 2018 13:03:26 +0100 Subject: [PATCH] README: markdown, screenshot, contact --- README.md | 127 ++++++++++++++++++++++++++++++++++++++++++++++ jack_keyboard.png | Bin 0 -> 21153 bytes 2 files changed, 127 insertions(+) create mode 100644 README.md create mode 100644 jack_keyboard.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..6c28b65 --- /dev/null +++ b/README.md @@ -0,0 +1,127 @@ +# jack-keyboard + +![Screenshot of jack-keyboard](jack-keyboard) + +## What is it? + +jack-keyboard is a virtual MIDI keyboard - a program that allows you to +send JACK MIDI events (play ;-) using your PC keyboard. It's somewhat +similar to vkeybd, except it uses JACK MIDI instead of ALSA, and the +keyboard mapping is much better - it uses the same layout as trackers +(like Impulse Tracker) did, so you have two and half octaves under your +fingers. + +## How to compile it? + +If you're using FreeBSD, install from ports - audio/jack-keyboard. + +Otherwise, you need JACK with MIDI support, gtk+ 2.6 or higher, +make(1), gcc and all the standard headers. Untar the file, type +'make install' and that's it. If there is any problem, drop me +an email (trasz@FreeBSD.org) and I will help you. Really. + +## How to use it? + +You need JACK with MIDI support and some softsynth that accepts +JACK MIDI as input. Ghostess, http://home.jps.net/~musound/, +is a good choice. Of course you will also need some DSSI plugin +that will make the actual sound. WhySynth is nice. + +When you have all of these installed: first, run jackd. Then run +ghostess with a plugin of choice. Then run jack-keyboard. Press +'z' key. You should hear sound. + +## Keyboard + +Keyboard mapping is the same as in Impulse Tracker. This is your +QWERTY keyboard: + + +----+----+ +----+----+----+ +----+----+ + | 2 | 3 | | 5 | 6 | 7 | | 9 | 0 | + +----+----+----+----+----+----+----+----+----+----+ + | q | w | e | r | t | y | u | i | o | p | + +----+----+----+----+----+----+----+----+----+----+ + | s | d | | g | h | j | + +----+----+----+----+----+----+----+ + | z | x | c | v | b | n | m | + +----+----+----+----+----+----+----+ + +And this is MIDI mapping. + + +----+----+ +----+----+----+ +----+----+ + |C#5 |D#5 | |F#5 |G#5 |A#5 | |C#6 |D#6 | + +----+----+----+----+----+----+----+----+----+----+ + | C5 | D5 | E5 | F5 | G5 | A5 | B5 | C6 | D6 | E6 | + +----+----+----+----+----+----+----+----+----+----+ + |C#4 |D#4 | |F#4 |G#4 |A#4 | + +----+----+----+----+----+----+----+ + | C4 | D4 | E4 | F4 | G4 | A4 | B4 | + +----+----+----+----+----+----+----+ + +Spacebar is a sustain key. Holding it when pressing or releasing key +will make that key sustained, i.e. Note Off MIDI event won't be sent +after releasing the key. To release (stop) all the sustained notes, +press and release spacebar. + +Holding Shift when pressing note will make it louder (it increases +velocity). Holding Ctrl will do the opposite. You can change the +default velocity by moving the Velocity slider. You can change the +"high" and "low" velocity values by moving the slider while holding +Shift or Ctrl keys. + +Pressing "-" and "+" keys on numeric keypad changes the octave your +keyboard is mapped to. Pressing "*" and "/" on numeric keypad changes +MIDI program (instrument). Pressing Insert or Delete keys will connect +jack-keyboard to the next/previous MIDI input port (it will cycle +between running instances of ghostess, for example). Home and End keys +change the MIDI channel. Page Up and Page Down keys switch the MIDI +bank. + +Esc works as a panic key - when you press it, all sound stops. + +## Setting channel/bank/program number directly + +To switch directly to a channel, bank or program, enter its number on +the numeric keypad (it won't be shown in any way) and press Home or End +(to change channel), Page Up or Page Down (to change bank) or "/" or +"*" (to change program). For example, to change to program number 123, +type, on the numeric keypad, "123/", without quotes. + +## Titlebar + +When -G xor -T is given, some informational messages in the title bar +appear. They are supposed to be self explanatory. If you see +"bank/program change not sent", it means that the bank/program numbers +as seen in the title bar were not sent. In other words, synth the +jack-keyboard is connected to may use different values. This happens +at startup and after switching between synths (using Insert/Delete +keys). To send bank/program change at startup, use -b and -p parame- +ters. To automatically send bank/program change after reconnect, use +the -u option. + +## Pianola mode + +In addition to the MIDI output port, jack-keyboard also opens MIDI +input (listening) port. MIDI events going into this port will be +passed to the output port unmodified, except for channel number, which +will be set to the one jack-keyboard is configured to use. Note On and +Note Off MIDI events will cause visible effect (pressing and releasing) +on keys, just like if they were being pressed using keyboard or mouse. + +jack-keyboard will never connect to it's own MIDI input port. It will +also refuse to connect to any other client whose name begins in "jack- +keyboard", unless the "-k" option is given. It is, however, possible +to connect these ports manually, using jack_connect or qjackctl; this +may create feedback loop. + +## License + +JACK Keyboard is distributed under the BSD license, two clause. + +## Contact + +If you have any questions, comments, suggestions, patches or anything, +let us know: +* Edward Tomasz Napierala (initial version) +* Hans Petter Selasky (further development, gtk3) +* Markus Schmidt (further development, UX/UI) diff --git a/jack_keyboard.png b/jack_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..5ef72fd30b8240e765d433076ed17533cd1c3628 GIT binary patch literal 21153 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 z%0D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

jx z086m0XmJ%)W(6jtjJ(lS>|;perQF5Sp8=2IHE$ zYnBvsBI@MUfBD_S71&T}T*6Ur7X@L}HwoB<{pSAq+^i`2z3lN{DgvJT*47rTrSf2Z zKk5fVPWt|V0Vqz3sr~^aoWi-Jg2hD+l}1Nf;YgOMFW@TD=;h_M$oe8&^Neyg9qTV> zaP@T|%N0?7=ZFBFW6v(4L^)*qsE_S`keB8lts3Y5Yva1(nogFuBBvm|N=Hf{QX&R| zC{02U5;`Fg1VjuaM8v2_$CD;qg%FS;#YBOGBIQ63#84BOg2GW%kglLe5ozxS$KAX4 z`MiJkvpYMxGvAq=+1X9=itY0T7PZG?V&6s_e~pnZrU=D2ZJ$-Ex$BW)$KD)8K9I=~ zuighkehcNONf9OiS=o%Ma%Zqr=e3GDPTVq2HsL4PPt5qmmXxCklYNT-B^NmwY-nbb z976^?#;z6I(x}0Pr6~x1#BZ$*(<)!e`Yo53$gAfGa3F z9tZ%46Nr|hZryGa-&;M6?ym-irO6ps`d z-MSdJKf@hga1H7QUZNiI)}Ex~=LhIqQX-#g6w1wFotbuARRAVZB|WqU^ZXW&uDa2j zi@;#HQ$EC!s)`h%feu0JDJrws4N^|!f0mQ|xPnreaW(4a5})zonHNwYrjo|@Y2*8c zkX@zi%)$)nA?PBRKkCdUw3|or(|`*<0_l=ydOWM&5U)D_Keov-F#S`iZ3l ztfKFZ`Th&7%L&fC&&Ml(D=z0O^hJ`=jNFm5B3sh(T68#)eo z?cB^2(aY(X_^zX)lWwj6H!Vg_fByVY3zCY!ug2O9iaY*fciwjw&t8Kn>WC?PX(@c3 z>kxNSeyBXVHL25%l#FGVm1D2R#+4Ik?MU?JyGRm-WQ!^iOl5XLL>CfZKoGNEq-}ki zw`}lg7f#1{u^t{p@8>dtenpp@kY1Sz`?Rz9+`VV6O5ASz15s6f68Wy} zPUXTgdC;1fWAEFJnGWe}*8iSjuNMLjAzRL-SZii}9UrG-p+Lo6M~KT$GoVU2Gc(gc zrKIptL7p%3LSEzV{KQ;V5ZHhnVa?)BxPBd+6G3Y3>r+2-W{|-!QxP68J+h0eTbE^b zyM+JM+oGrv@-svaZfeEt7y}ePo11gy^prlFFamz|_=lWhOmE!(ghPevxB>%eL-Oag zGxz>Yj9dxTl1M5pE|x(A2XBOjhl}A@mZSHl0y=WoIPz&FRXC^^5>oD1IL)Q%oMrkqpTOW0rDBfo<3K{_-0=eI6Aw+5oV0T@+-8&z z6b`|?RqxG1Ig#2Q4HN@+cWcUXb#-^6!Gf^fNak8J`nECazo;1!`yOvDuo>+siP)wpmUT=Ng-x~>#M1hNs0*7*5w(*IH`FDj+&MWZ8s&P^a<2%H^KMkRf zrda-AK3BsC=Lg6eD0BznAZh8GrOA**z3ptt32T5JOJTLrQ1X zx(%>_rW8^tA)`wdh@Xk?%^s-`Al8H`@2d_=q!^CLAo!}VJx&H#H)N(gta5B+`$!2`7OIn zN)`7-)aJRBW2!tny<0%Z&m>wI@1jfRERjTk^L|tJ9S%{<}d9yxc{Md`WIxDaYDYuzZ&tHl7Cj3!F2)Yh>$z4RVJ0 z5qU)R%hmHctrl}ZgX&n^sZtlCrwpWoKm}pNuiBlc${<6PPsv=2?L5#*!2el`kqnmo z(Ns~khEc*|tOXzQ?dfSEqPNUfnL-Pkwp`Rx#hBUV(gI;gWP8ky&E0jk!=U^l#cd<0 zDRrm0XcKNtjl|PaRhc&ws+(pGlSuTR)xWWnzgQe(}to zN0?+``2LglFYX~>N}g7T`5U+1oQqQ-3vr(j2^}_Vm(~O4UcUO!@zDL;g+zSxpCh@e0#V`eq@oFS~sAwb8~g$AT$?n+yjH=~YY7%40Ik-qmgiBn^#4`b&f9_$DyhMlfS3+J`4$ zW^~kl?cQ!qu`@B0Pj~}&C=+6s@n_NFY&~gdFUE_!1D44}NO;j>|w* z$JFIZ{==(ZZb;>edpD`OjaerH23pnDEKFh)3wQ6*_77S!tGE5Y<1?!cbz)y(^LFa; zALB3K%TF%%ou`&VZBEHGX__=*vEeGUZxjBqdB;~z^`{7aEaKwj zxCS3>O?T%8DErXmMb?FuWj z*N~&t>IT1SX>OCkhkj0au_`sv0$FUG#f!eX*Yd4sqDdjy_*AxMpG+=Mqptike;y_r#%^gT;O(ohw%#3M8Ay|?NC=v4Li20ivQ**xJQ%;%H zKVtt#`$$-9h#0!r+mprJ1?u8U%swDzw?qLY86%b`@(N{DEf3OfSAe;A&^9a}nt_|o zbW$UTs^fpiDo$nXJ|p!n{FFj{g=tVph&IpzY z*4=6_5%io1chduk`G%EGK&p#zEU@ddcIajESis<@JLQij&;}{Hy0EJT=ws8WpT%sr z+wS~)8j2k9kX*mk8-0Fg<1EG^;z)lR@Y7G=<;RyFVZ&VXVu#s%kn%z4*>8m9#&0Zn zg~?il29(9|gYn79R6=x)wh#h;ZGOgY3|_()Rp!kz7T{`s4AahY>0}+GKh@3c zHt^2BPDyGzQ0Dbj$%o~NdG|Sf{joTT37AB1$MVvFr`*>VowfYG91~~m4SjRH3I<=s zrdI7)(6Flo>(1fNcmH+bbr)(JbzI?Dns%$Xbl}*h$3BO-uP`1eOfsT|PaTa^+vx6C z-5P3xeQiy;K<_q;zN16dIlD~n<3AaE#ZvdMUsVr}?v_=?y41at!JP%2vn%b*EqIq{ znx1r%m)6zUk)H1t=67oCepfl*-9+8YSW=rl3|6(rbyc)AhFDm`RR%%nrHrNQ($ycZ zQ**za{N*00?(#Ej>rGCWWZZ+L)%;9)x_Z0N^$U=jI$ag)lHRV(9