// onwork0009 - ver 190228 lunch
// 190226 night : add multi touch
// 190228 lunch : alter key value to katakana
//var inputfile='https://recruit-lattice.jp/wp-content/uploads/2018/01/test2.json';
var inputfile='https://recruit-lattice.jp/wp-content/uploads/2018/01/ElectricalFan_test1.json';
//var inputfile='hotx.gltf';
//var inputfile='ElectricalFan_test1.json';
window.onload = function() {
var divPage = document.getElementById("page");
if(divPage){
var currentStyle = divPage.getAttribute("style");
if (currentStyle) {
divPage.setAttribute("style", currentStyle + ";z-index: -1");
} else {
divPage.setAttribute("style", "z-index: -1");
}
console.log(divPage);
}
var button_vr = document.getElementById("button_vr");
if(button_vr){
//console.log(button_vr.onclick.toString());
button_vr.onclick = function (event) {
//current_onclick();
testVRhtml();
var ctrlVowel = document.getElementById("ctrlVowel");
//console.log(ctrlVowel);
ctrlVowel.style.visibility="visible";
webmidiinit();
}
}
//console.log(button_vr);
}
// test
document.write("
"
//+"
"
// D :-x, E :+x, F :-y, G:+y, A:c, B:-z, C:+z
/*
+"
"//onclick=\"modelprocXYZ(-1, 0, 0)\">"
+"
"//onclick=\"modelprocXYZ(+1, 0, 0)\">"
+"
"//onclick=\"modelprocXYZ( 0,-1, 0)\">"
+"
"//onclick=\"modelprocXYZ( 0,+1, 0)\">"
+"
"//onclick=\"moveCenter()\">"
+"
"//onclick=\"modelprocXYZ( 0, 0,-1)\">"
+"
"//onclick=\"modelprocXYZ( 0, 0,+1)\">"
*/
+"
"//onclick=\"modelprocXYZ(-1, 0, 0)\">"
+"
"//onclick=\"modelprocXYZ(+1, 0, 0)\">"
+"
"//onclick=\"modelprocXYZ( 0,-1, 0)\">"
+"
"//onclick=\"modelprocXYZ( 0,+1, 0)\">"
+"
"//onclick=\"moveCenter()\">"
+"
"//onclick=\"modelprocXYZ( 0, 0,-1)\">"
+"
"//onclick=\"modelprocXYZ( 0, 0,+1)\">"
+"
"
+"
"
+"
");
function sleep(sleeptime){
var time0 = new Date().getTime();
var time1 = new Date().getTime();
while (time1 < time0 + sleeptime){
time1 = new Date().getTime();
}
return;
}
var currentval_range01 = -1; //document.getElementById("range01").value
var isMouseOnInputRange01 = false;
var elemRange01 = document.getElementById("range01");
elemRange01.onmousedown = function (){isMouseOnInputRange01 = true;}
elemRange01.onmouseup = function (){isMouseOnInputRange01 = false;}
console.log( elemRange01 );
if(window.TouchEvent){
// イベントリスナーに対応している
if(window.addEventListener){
elemRange01.addEventListener("touchmove",
function (itEvent){isMouseOnInputRange01 = true;
}
);
elemRange01.addEventListener("touchstart",
function (itEvent){isMouseOnInputRange01 = true;
}
);
elemRange01.addEventListener("touchend",
function (itEvent){isMouseOnInputRange01 = false;
}
);
// javascript フリック js - 一時的にスクロールを無効にする方法は?
// https://code.i-harness.com/ja-jp/q/48c8e9
var elemEstmVowel = document.getElementById("estmVowel");
elemEstmVowel.addEventListener("touchmove",
function (itEvent){itEvent.preventDefault();
}
);
}
}
var elm_btnC = document.getElementById("btnC");
var elm_btnD = document.getElementById("btnD");
var elm_btnE = document.getElementById("btnE");
var elm_btnF = document.getElementById("btnF");
var elm_btnG = document.getElementById("btnG");
var elm_btnA = document.getElementById("btnA");
var elm_btnB = document.getElementById("btnB");
elm_btnC.onmouseup = function (){ eventOutC(); }
elm_btnC.onmousedown = function (){ eventInC(0.8); }
elm_btnD.onmouseup = function (){ eventOutD(); }
elm_btnD.onmousedown = function (){ eventInD(0.8); }
elm_btnE.onmouseup = function (){ eventOutE(); }
elm_btnE.onmousedown = function (){ eventInE(0.8); }
elm_btnF.onmouseup = function (){ eventOutF(); }
elm_btnF.onmousedown = function (){ eventInF(0.8); }
elm_btnG.onmouseup = function (){ eventOutG(); }
elm_btnG.onmousedown = function (){ eventInG(0.8); }
elm_btnA.onmouseup = function (){ eventOutA(); }
elm_btnA.onmousedown = function (){ eventInA(0.8); }
elm_btnB.onmouseup = function (){ eventOutB(); }
elm_btnB.onmousedown = function (){ eventInB(0.8); }
if(window.TouchEvent){
// イベントリスナーに対応している
if(window.addEventListener){
elm_btnC.addEventListener("touchstart", function (itEvent){ eventInC(0.8); } );
elm_btnC.addEventListener("touchend", function (itEvent){ eventOutC(); } );
elm_btnD.addEventListener("touchstart", function (itEvent){ eventInD(0.8); } );
elm_btnD.addEventListener("touchend", function (itEvent){ eventOutD(); } );
elm_btnE.addEventListener("touchstart", function (itEvent){ eventInE(0.8); } );
elm_btnE.addEventListener("touchend", function (itEvent){ eventOutE(); } );
elm_btnF.addEventListener("touchstart", function (itEvent){ eventInF(0.8); } );
elm_btnF.addEventListener("touchend", function (itEvent){ eventOutF(); } );
elm_btnG.addEventListener("touchstart", function (itEvent){ eventInG(0.8); } );
elm_btnG.addEventListener("touchend", function (itEvent){ eventOutG(); } );
elm_btnA.addEventListener("touchstart", function (itEvent){ eventInA(0.8); } );
elm_btnA.addEventListener("touchend", function (itEvent){ eventOutA(); } );
elm_btnB.addEventListener("touchstart", function (itEvent){ eventInB(0.8); } );
elm_btnB.addEventListener("touchend", function (itEvent){ eventOutB(); } );
}
}
// mic range ctrl
var coefScaleVol = 1.5;
var coefRotBlade = 1.5;
var coefPosSprt = 1.5;
var userAgent = window.navigator.userAgent.toLowerCase();
// iOSのデバイス
if(userAgent.indexOf('iphone') != -1 || userAgent.indexOf('ipad') != -1 || userAgent.indexOf('ipod') != -1) {
}
// Androidのfirefox
if(userAgent.indexOf('android') != -1 && userAgent.indexOf('firefox') != -1) {
}
var objPosOrig = null;
function parseChGetPos(groupObject3D, objPosOrig){
var n_ch = 0;
for (n_ch = 0; n_ch < groupObject3D.children.length; n_ch++) {
var target = groupObject3D.children[n_ch];
//if (target.name=='') {target.name = String(objPosOrig.length());}
target.name = String(Object.keys(objPosOrig).length) +'_'+ target.name;
objPosOrig[target.name] = target.position.clone();
objPosOrig = parseChGetPos(target, objPosOrig);
//target.__dirtyPosition = true;
//target.__dirtyRotation = true;
}
return objPosOrig;
}
function parseChAppCoef(groupObject3D, Coef){
var n_ch = 0;
for (n_ch = 0; n_ch < groupObject3D.children.length; n_ch++) {
var target = groupObject3D.children[n_ch];
if(target.name!=''){//console.log(target.name);
var posorig = objPosOrig[target.name];
if (posorig.x != 0.0 || posorig.y != 0.0 || posorig.z != 0.0) {
//target.position.set( Coef * posorig.x,Coef * posorig.y,Coef * posorig.z);
target.position.x = Coef * posorig.x;
target.position.y = Coef * posorig.y;
target.position.z = Coef * posorig.z;
target.updateMatrix();
}
}
parseChAppCoef(target, Coef);
}
}
function parseChResetPos(groupObject3D){
parseChAppCoef(groupObject3D, 1.0);
};
function init_objPosOrig(){
var iframe1 = document.getElementById("iframe1");
var winelem =iframe1.contentWindow;
var element = iframe1.contentDocument.getElementById("div_a-scene");
var element2 = iframe1.contentDocument.getElementById("obj2");
var groupObject3D = element2.object3D;
if(objPosOrig == null) {
console.log("objPosOrig==null");
objPosOrig = {};
objPosOrig = parseChGetPos(groupObject3D, objPosOrig);
}else{parseChResetPos(groupObject3D);}
console.log(objPosOrig);
}
var scaleScaleVol = 1.0;
var scalePosSprt = 1.0;
function moveCenter(){
var iframe1 = document.getElementById("iframe1");
var winelem =iframe1.contentWindow;
var element = iframe1.contentDocument.getElementById("div_a-scene");
var rotcamera = iframe1.contentDocument.getElementById('camera');
var curposition = rotcamera.getAttribute('position');
var rottarget = iframe1.contentDocument.getElementById('obj');
//console.log(rottarget);
var rotation = rottarget.getAttribute('rotation');
// console.log(rotation);
//curposition.x = 0;
//curposition.y = 0;
//rottarget.setAttribute('rotation', rotation);
//rotcamera.setAttribute('position', curposition);
/*
scaleScaleVol = 1.0;
scalePosSprt = 1.0;
var scale = rottarget.getAttribute('scale');
if (scale == null) {scale = new THREE.Vector3();}
scale.x = 1.0;
scale.y = 1.0;
scale.z = 1.0;
rottarget.setAttribute('scale', scale);
if(objPosOrig != null){
var element2 = iframe1.contentDocument.getElementById("obj2");
var groupObject3D = element2.object3D;
parseChResetPos(groupObject3D);
}
document.getElementById("range01").value = 0.0;
if(intervalId != null) {
isMouseOnInputRange01 = true;
}
*/
var curposition = rottarget.getAttribute('position');
if (curposition == null) {curposition = new THREE.Vector3();}
curposition.x *= scaleScaleVol*0.5;
curposition.y *= scaleScaleVol*0.5;
curposition.z *= scaleScaleVol*0.5;
if(Math.abs(curposition.x) < 0.01) {curposition.x = 0;}
if(Math.abs(curposition.y) < 0.01) {curposition.y = 0;}
if(Math.abs(curposition.z) < 0.01) {curposition.z = 0;}
rottarget.setAttribute('position', curposition);
}
function ctrlRotBlade() {
var iframe1 = document.getElementById("iframe1");
console.log(iframe1.contentWindow);
var winelem =iframe1.contentWindow;
var element = iframe1.contentDocument.getElementById("div_a-scene");
console.log(element);
var element2 = iframe1.contentDocument.getElementById("obj2");
console.log(element2);
// https://github.com/aframevr/aframe/blob/master/docs/core/entity.md
var groupObject3D = element2.object3D;
//console.log(groupObject3D.parent);
var targetrot = groupObject3D.children[0].children[0].children[0].children[1]; // Blade_Assy
var val_range01 = document.getElementById("range01").value * 1.0 / 255;
var varOpe = val_range01;
var coefrot = varOpe*0.85;
//console.log(element2.object3D.children[0].children[0].children[0].children[1].children[2].name);
element2.object3D.children[0].children[0].children[0].children[1].children[2].rotateZ(-coefrot);
element2.object3D.children[0].children[0].children[0].children[1].children[2].updateMatrix();
}
function modelproc() { console.log("modelproc");
if(recogCommand == null) {return;}
noticeBox3.textContent = recogCommand;
if(recogCommand == '中'){moveCenter();return;}
if(recogCommand == '羽'){ctrlRotBlade();return;}
var iframe1 = document.getElementById("iframe1");
var winelem =iframe1.contentWindow;
var element = iframe1.contentDocument.getElementById("div_a-scene");
var rotcamera = iframe1.contentDocument.getElementById('camera');
var curposition = rotcamera.getAttribute('position');
//console.log(curposition);
// //var rotation = rotcamera.getAttribute('rotation');
// //console.log(rotation);
var rottarget = iframe1.contentDocument.getElementById('obj');
//console.log(rottarget);
var rotation = rottarget.getAttribute('rotation');
// console.log(rotation);
var scaleScaleVol = 1.0;
var val_range01 = document.getElementById("range01").value * 1.0 / 255;
scaleScaleVol = val_range01 * 5;
var curposition = rottarget.getAttribute('position');
if (curposition == null) {curposition = new THREE.Vector3();}
if(recogCommand == '右') curposition.x += scaleScaleVol*scalePosSprt;
if(recogCommand == '左') curposition.x -= scaleScaleVol*scalePosSprt;
if(recogCommand == '上') curposition.y += scaleScaleVol*scalePosSprt;
if(recogCommand == '下') curposition.y -= scaleScaleVol*scalePosSprt;
if(recogCommand == '前') curposition.z += scaleScaleVol*scalePosSprt;
if(recogCommand == '奥') curposition.z -= scaleScaleVol*scalePosSprt;
rottarget.setAttribute('position', curposition);
recogCommand = null;
}
function modelprocXYZ(midi_x,midi_y,midi_z) {
var iframe1 = document.getElementById("iframe1");
var winelem =iframe1.contentWindow;
var element = iframe1.contentDocument.getElementById("div_a-scene");
var rotcamera = iframe1.contentDocument.getElementById('camera');
var curposition = rotcamera.getAttribute('position');
var rottarget = iframe1.contentDocument.getElementById('obj');
var rotation = rottarget.getAttribute('rotation');
var scaleScaleVol = 1.0;
var val_range01 = document.getElementById("range01").value * 1.0 / 255;
scaleScaleVol = val_range01 * 5;
var curposition = rottarget.getAttribute('position');
if (curposition == null) {curposition = new THREE.Vector3();}
if(midi_x > 0) curposition.x += scaleScaleVol*scalePosSprt;
if(midi_x < 0) curposition.x -= scaleScaleVol*scalePosSprt;
if(midi_y > 0) curposition.y += scaleScaleVol*scalePosSprt;
if(midi_y < 0) curposition.y -= scaleScaleVol*scalePosSprt;
if(midi_z > 0) curposition.z += scaleScaleVol*scalePosSprt;
if(midi_z < 0) curposition.z -= scaleScaleVol*scalePosSprt;
rottarget.setAttribute('position', curposition);
recogCommand = null;
}
window.AudioContext = window.AudioContext ||window.webkitAudioContext ||window.mozAudioContext ||window.oAudioContext ||window.msAudioContext;
var intervalId = null;
var intervalfunc = null;
// https://qiita.com/ShoheiOno/items/34ae96c2563586982490
// MIDI Key
var midiKeyStatus = {
C : 0,
D : 0,
E : 0,
F : 0,
G : 0,
A : 0,
B : 0,
};
var midiKeyXYZreserved = {
X : 0, Y : 0, Z : 0
}
function eventInC(eventVal){
modelprocXYZ( 0, 0,+1); midiKeyStatus.C = eventVal;
if(midiKeyXYZreserved.Z == 0){midiKeyXYZreserved.Z = +1}
}
function eventInD(eventVal){
modelprocXYZ(-1, 0, 0); midiKeyStatus.D = eventVal;
if(midiKeyXYZreserved.X == 0){midiKeyXYZreserved.X = -1}
}
function eventInE(eventVal){
modelprocXYZ(+1, 0, 0); midiKeyStatus.E = eventVal;
if(midiKeyXYZreserved.X == 0){midiKeyXYZreserved.X = +1}
}
function eventInF(eventVal){
modelprocXYZ( 0,-1, 0); midiKeyStatus.F = eventVal;
if(midiKeyXYZreserved.Y == 0){midiKeyXYZreserved.Y = -1}
}
function eventInG(eventVal){
modelprocXYZ( 0,+1, 0); midiKeyStatus.G = eventVal;
if(midiKeyXYZreserved.Y == 0){midiKeyXYZreserved.Y = +1}
}
function eventInA(eventVal){
moveCenter(); midiKeyStatus.A = eventVal;
}
function eventInB(eventVal){
modelprocXYZ( 0, 0,-1); midiKeyStatus.B = eventVal;
if(midiKeyXYZreserved.Z == 0){midiKeyXYZreserved.Z = -1}
}
function eventOutC(){
midiKeyStatus.C = 0;
if(midiKeyStatus.B > 0){midiKeyXYZreserved.Z = -1} else {midiKeyXYZreserved.Z = 0} // C
}
function eventOutD(){
midiKeyStatus.D = 0;
if(midiKeyStatus.E > 0){midiKeyXYZreserved.X = +1} else {midiKeyXYZreserved.X = 0} // D
}
function eventOutE(){
midiKeyStatus.E = 0;
if(midiKeyStatus.D > 0){midiKeyXYZreserved.X = -1} else {midiKeyXYZreserved.X = 0} // E
}
function eventOutF(){
midiKeyStatus.F = 0;
if(midiKeyStatus.G > 0){midiKeyXYZreserved.Y = +1} else {midiKeyXYZreserved.Y = 0} // F
}
function eventOutG(){
midiKeyStatus.G = 0;
if(midiKeyStatus.F > 0){midiKeyXYZreserved.Y = -1} else {midiKeyXYZreserved.Y = 0} // G
}
function eventOutA(){
midiKeyStatus.A = 0; // A
}
function eventOutB(){
midiKeyStatus.B = 0;
if(midiKeyStatus.C > 0){midiKeyXYZreserved.Z = +1} else {midiKeyXYZreserved.Z = 0} // B
}
// MIDIデバイス
var midiDevices = {
inputs: {},
outputs: {}
};
function webmidiinit() {
console.log("webmidiinit");
/*
// 成功したときの処理
function requestSuccess(data) {
console.log('success!!!', data);
}
*/
// 成功したときの処理
function requestSuccess(data) {
// Inputデバイスの配列を作成
var inputIterator = data.inputs.values();
for (var input = inputIterator.next(); !input.done; input = inputIterator.next()) {
var value = input.value;
// デバイス情報を保存
midiDevices.inputs[value.name] = value;
// イベント登録
value.addEventListener('midimessage', inputEvent, false);
}
/*
// Outputデバイスの配列を作成
var outputIterator = data.outputs.values();
for (var output = outputIterator.next(); !output.done; output = outputIterator.next()) {
var value = output.value;
// デバイス情報を保存
midiDevices.outputs[value.name] = value;
}
*/
}
// 失敗したときの処理
function requestError(error) {
console.error('error!!!', error);
}
// MIDIデバイスにアクセスする
function requestMIDI() {
if (navigator.requestMIDIAccess) {
navigator.requestMIDIAccess().then(requestSuccess, requestError);
} else {
requestError();
}
}
requestMIDI();
// interval
intervalfunc = function(){
var x_chk = 0;
var y_chk = 0;
var z_chk = 0;
//console.log("x : " + x_chk + " y : " + y_chk + " z : " + z_chk);
//console.log(midiKeyXYZreserved);
//console.log(midiKeyStatus);
if(midiKeyXYZreserved.X == -1) {x_chk = midiKeyXYZreserved.X * midiKeyStatus.D; }
if(midiKeyXYZreserved.X == +1) {x_chk = midiKeyXYZreserved.X * midiKeyStatus.E; }
if(midiKeyXYZreserved.Y == -1) {y_chk = midiKeyXYZreserved.Y * midiKeyStatus.F; }
if(midiKeyXYZreserved.Y == +1) {y_chk = midiKeyXYZreserved.Y * midiKeyStatus.G; }
if(midiKeyXYZreserved.Z == -1) {z_chk = midiKeyXYZreserved.Z * midiKeyStatus.B; }
if(midiKeyXYZreserved.Z == +1) {z_chk = midiKeyXYZreserved.Z * midiKeyStatus.C; }
if( x_chk != 0 || y_chk != 0 || z_chk != 0) {
modelprocXYZ( x_chk, y_chk, z_chk );
}
if(midiKeyStatus.A > 0) { moveCenter(); }
};
intervalId = setInterval(intervalfunc, 10);
}; // webmidiinit
// Inputを受け取ったときのイベント
function inputEvent(e) {
var target = e.target;
//var device = midiDevices.outputs[target.name];
var message = '';
var numArray = [];
// 2桁の16進数にして表示する
event.data.forEach(function(val) {
numArray.push(('00' + val.toString(16)).substr(-2));
});
message = numArray.join(' ');
// InputしたDeviceに結果を送信する
//device.send(e.data);
// 2桁の16進数を表示
console.log(message);
if(event.data[0] == 8*16) {
switch (event.data[1] % 12) {
// D :-x, E :+x, F :-y, G:+y, A:c, B:-z, C:+z
case 0 : eventOutC(); break; // C
case 2 : eventOutD(); break; // D
case 4 : eventOutE(); break; // E
case 5 : eventOutF(); break; // F
case 7 : eventOutG(); break; // G
case 9 : eventOutA(); break; // A
case 11 : eventOutB(); break; // B
}
}
else if(event.data[0] == 9*16) {
switch (event.data[1] % 12) {
// D :-x, E :+x, F :-y, G:+y, A:c, B:-z, C:+z
case 0 : eventInC(event.data[2]/80); break; // C
case 2 : eventInD(event.data[2]/80); break; // D
case 4 : eventInE(event.data[2]/80); break; // E
case 5 : eventInF(event.data[2]/80); break; // F
case 7 : eventInG(event.data[2]/80); break; // G
case 9 : eventInA(event.data[2]/80); break; // A
case 11 : eventInB(event.data[2]/80); break; // B
}
}
} // inputEvent
// https://www.ipentec.com/document/javascript-accept-keydown
// https://web-designer.cman.jp/javascript_ref/keyboard/keycode/
var bStatusShift = false;
var bStatusCtrl = false;
// apple logic 1.5oct C-F : ASDFGHJKL;: -> 65 83 68 70 71 72 74 75 76 186 186 ...
document.onkeyup = function (e){
switch (e.keyCode) {
// D :-x, E :+x, F :-y, G:+y, A:c, B:-z, C:+z
case 75 :
case 65 : eventOutC(); break; // C
case 83 : eventOutD(); break; // D
case 68 : eventOutE(); break; // E
case 70 : eventOutF(); break; // F
case 71 : eventOutG(); break; // G
case 72 : eventOutA(); break; // A
case 74 : eventOutB(); break; // B
case 16 : buttonValShift(false); break; // shift
case 17 : buttonValCtrl(false); break; // ctrl
}
}
document.onkeydown = function (e){
switch (e.keyCode) {
// D :-x, E :+x, F :-y, G:+y, A:c, B:-z, C:+z
case 75 :
case 65 : eventInC(1); break; // C
case 83 : eventInD(1); break; // D
case 68 : eventInE(1); break; // E
case 70 : eventInF(1); break; // F
case 71 : eventInG(1); break; // G
case 72 : eventInA(1); break; // A
case 74 : eventInB(1); break; // B
case 16 : buttonValShift(true); break; // shift
case 17 : buttonValCtrl(true); break; // ctrl
}
}
/*
var elm_btnC = document.getElementById("btnC");
var elm_btnD = document.getElementById("btnD");
var elm_btnE = document.getElementById("btnE");
var elm_btnF = document.getElementById("btnF");
var elm_btnG = document.getElementById("btnG");
var elm_btnA = document.getElementById("btnA");
var elm_btnB = document.getElementById("btnB");
*/
function buttonValShift(bIn) {
// A[SDFGHJK];:
if(bIn){ bStatusShift = true;
elm_btnD.value = "S";
elm_btnE.value = "D";
elm_btnF.value = "F";
elm_btnG.value = "G";
elm_btnA.value = "H";
elm_btnB.value = "J";
elm_btnC.value = "K";
}
else{ bStatusShift = false;
if(bStatusCtrl) {buttonValCtrl(true); return;}
elm_btnD.value = "レ";
elm_btnE.value = "ミ";
elm_btnF.value = "ファ";
elm_btnG.value = "ソ";
elm_btnA.value = "ラ";
elm_btnB.value = "シ";
elm_btnC.value = "ド";
}
}
function buttonValCtrl(bIn) {
// A[SDFGHJK];:
if(bIn){ bStatusCtrl = true;
elm_btnD.value = "-x";
elm_btnE.value = "+x";
elm_btnF.value = "-y";
elm_btnG.value = "+y";
elm_btnA.value = "c";
elm_btnB.value = "-z";
elm_btnC.value = "+z";
}
else{ bStatusCtrl = false;
if(bStatusShift) {buttonValShift(true); return;}
elm_btnD.value = "レ";
elm_btnE.value = "ミ";
elm_btnF.value = "ファ";
elm_btnG.value = "ソ";
elm_btnA.value = "ラ";
elm_btnB.value = "シ";
elm_btnC.value = "ド";
}
}