Google Guitarlet

  • /*
     * @title Google Guitarlet
     * @description Googleトップページのギターの演奏を記録したり、再生したりします
     * @include http://www.google.co.jp
     * @license MIT License
     * @require 
     */
    
    /* 動作環境: 
     *   Firefox 4.0.1で動作確認 
     *   Google Chromeでは動作しない
     * 
     * 操作方法
     *   あらかじめGoogleトップページのギター下に表示されているキーボードボタンを押します
     *   
     *   Rキー  記録開始
     *   Sキー  記録した演奏を再生
     *   
     *   録音中の操作
     *   Eキー  記録終了
     */
    
    javascript:
    (function(){
    	var state_ = '_';
    	window.addEventListener('keydown', function(e){
    		var key = e.keyCode;
    		
    		switch( state_ ){
    		case '_':
    			if( key === 'R'.charCodeAt(0) ){
    				state_ = 'R';
    				document.title = '録音中';
    				startRecording();
    				
    				e.stopPropagation();
    			}else if( key === 'S'.charCodeAt(0) ){
    				state_ = 'P';
    				document.title = '再生中';
    				perform(function(){
    					state_ = '_';
    					document.title = '再生終了';
    				});
    				
    				e.stopPropagation();
    			}
    			break;
    		case 'R':
    			if( key === 'E'.charCodeAt(0) ){
    				state_ = '_';
    				stopRecording();
    				document.title = '録音終了';
    				
    				e.stopPropagation();
    			}
    			break;
    		case 'P':
    			break;
    		}
    	}, true);
    	
    	var r = [];
    	function startRecording(){
    		r = [];
    		document.body.addEventListener('keydown', keyRecorder, true);
    	}
    	function stopRecording(){
    		document.body.removeEventListener('keydown', keyRecorder, true);
    	}
    	function keyRecorder(e){
    		r.push({key: e.keyCode, time: e.timeStamp});
    	}
    	
    	function perform(f){
    		var i = 0;
    		(function(){
    			var e = r[i++];
    			sendKey(e.key);
    			if( i < r.length )
    				setTimeout(arguments.callee, r[i].time - e.time);
    			else f();
    		})();
    	}
    	
    	function sendKey(k){
    		var e = document.createEvent('KeyboardEvent');
    		e.initKeyEvent('keydown', !0, !0, window, !1, !1, !1, !1, k, 0);
    		document.body.dispatchEvent(e);
    	}
    })();
    
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2011/06/09 19:42:56 - 2011-06-09
  2. 2011/06/09 16:01:36 - 2011-06-09