MKH-CAS 間・型・腹 複雑系トレーニングシステム | GETTA

MKH-CAS

間・型・腹 複雑系トレーニングシステム

現在フェーズ
CASスコア
0
セッション
0
連続日数
複雑系トレーニングへようこそ
自己組織化で最高のパフォーマンスを

MKH-CASは、日本の伝統的身体論「間・型・腹」を複雑系科学で再構築したトレーニングシステムです。予測不可能な競技環境において、自己組織化的に適応する能力を開発します。

3
間・型・腹の三位一体
間(Ma)― 関係性のOS
システムの自由度を保証し、同期と創発を可能にする時空間的ポテンシャル場
型(Kata)― 制約のアルゴリズム
無限の探索空間を限定し、学習と進化を加速させるストレンジ・アトラクタ
腹(Hara)― 身体的ジャイロスコープ
多層的情報の統合と動的平衡を維持するバイオホロンの統合点
守破離フェーズ転移
固体状態
型の習得・凍結
液体状態
カオスの縁
気体状態
自律分散
MKH多角的診断
間・型・腹の習熟度と守破離フェーズを測定
リズム同期
パターン再現
バランス制御
📋
質問診断

診断テストを選択してください

各テストを完了すると、間・型・腹それぞれの習熟度と、現在の守破離フェーズが判定されます。

フェーズ別トレーニング
現在のフェーズに最適化されたメニュー
実践ワークスペース
トレーニング支援ツール
タイマー
🎵
メトロノーム
🌬
呼吸ガイド
バランス計測
00:00
プリセット:
60
BPM

守フェーズ推奨:60BPM|破フェーズ推奨:80-100BPM

準備
ボタンを押して開始
センサー待機中
動揺面積
動揺速度

スマートフォンを腰(丹田付近)に固定して計測してください

📝
練習ジャーナル
👣
一本歯下駄GETTAプロトコル
間・型・腹を同時に刺激する理想的ツール

“一本歯下駄は、不安定性による「間」の創出、腱主導という「型」の誘発、重心意識による「腹」の活性化を同時に実現する”

― MKH-CAS理論

8段階プロトコル

💡
GETTAの複雑系的機能
間:不安定性による自己組織化の余地創出
一点支持という極端な不安定性が、過剰な制御を手放させ、身体の自己組織化が起こる余地(間)を生み出します。
型:腱主導パターンの自然な誘発
GETTAでのバランス維持は、筋主導ではなく腱主導の動作パターンを自然に引き出します。これは伝統的な「型」に共通する効率的な身体使用法です。
腹:重心意識の強制的活性化
倒れないためには「腹」(重心)の位置を常に感知し続ける必要があります。丹田への意識が自然と高まり、全身の統合点が明確化されます。
タイトル
光るタイミングに合わせて中央をタップしてください(20回)
0 / 20
';} function startRhythmTest(){if(rhythmTest.running)return;rhythmTest={running:true,interval:null,beatTime:0,count:0,errors:[]};document.getElementById('rhythm-start-btn').disabled=true;document.getElementById('rhythm-count').textContent='0';var target=document.getElementById('rhythm-target');var bpm=60;var interval=60000/bpm;target.addEventListener('click',handleRhythmTap);rhythmTest.interval=setInterval(function(){if(rhythmTest.count>=20){finishRhythmTest();return;}rhythmTest.beatTime=Date.now();target.classList.add('mkhcas-beat');setTimeout(function(){target.classList.remove('mkhcas-beat');},100);},interval);} function handleRhythmTap(){if(!rhythmTest.running||rhythmTest.beatTime===0)return;var tapTime=Date.now();var error=Math.abs(tapTime-rhythmTest.beatTime);rhythmTest.errors.push(error);rhythmTest.count++;var target=document.getElementById('rhythm-target');var feedback=document.getElementById('rhythm-feedback');target.classList.add('mkhcas-tap');setTimeout(function(){target.classList.remove('mkhcas-tap');},100);document.getElementById('rhythm-count').textContent=rhythmTest.count;if(error=20){finishRhythmTest();}} function finishRhythmTest(){rhythmTest.running=false;clearInterval(rhythmTest.interval);var target=document.getElementById('rhythm-target');target.removeEventListener('click',handleRhythmTap);var avgError=rhythmTest.errors.reduce(function(a,b){return a+b;},0)/rhythmTest.errors.length;var score=Math.max(0,Math.min(100,Math.round(100-avgError/2)));MKHCAS_STATE.testResults.ma=score;MKHCAS_STATE.scores.ma=score;document.querySelector('[data-test="ma"]').classList.add('mkhcas-completed');document.getElementById('rhythm-feedback').textContent='スコア: '+score+'点(平均誤差: '+Math.round(avgError)+'ms)';document.getElementById('rhythm-start-btn').disabled=false;document.getElementById('rhythm-start-btn').textContent='再テスト';checkAllTestsComplete();} function renderPatternTest(container){container.innerHTML='
パターン再現テスト
表示されるパターンを記憶し、同じ順番でタップしてください
ボタンを押して開始
';} function startPatternTest(){patternTest={running:true,pattern:[],userPattern:[],level:3,phase:'show',correct:0};document.getElementById('pattern-start-btn').disabled=true;nextPatternRound();} function nextPatternRound(){patternTest.pattern=[];patternTest.userPattern=[];patternTest.phase='show';for(var i=0;i=patternTest.pattern.length){clearInterval(showInterval);patternTest.phase='input';document.getElementById('pattern-status').textContent='同じ順番でタップしてください';enablePatternInput();return;}var cell=cells[patternTest.pattern[idx]];cell.style.background='#0891b2';setTimeout(function(){cells.forEach(function(c){c.style.background='#e5e7eb';});},400);idx++;},700);} function enablePatternInput(){var cells=document.querySelectorAll('.mkhcas-pattern-cell');cells.forEach(function(cell){cell.onclick=function(){if(patternTest.phase!=='input')return;var idx=parseInt(this.getAttribute('data-idx'));patternTest.userPattern.push(idx);this.style.background='#06b6d4';var self=this;setTimeout(function(){self.style.background='#e5e7eb';},200);var pos=patternTest.userPattern.length-1;if(patternTest.userPattern[pos]!==patternTest.pattern[pos]){finishPatternTest();return;}if(patternTest.userPattern.length===patternTest.pattern.length){patternTest.correct++;patternTest.level++;if(patternTest.level>8){finishPatternTest();}else{document.getElementById('pattern-status').textContent='正解!次のレベル...';setTimeout(nextPatternRound,1000);}}};});} function finishPatternTest(){patternTest.running=false;var score=Math.min(100,Math.round((patternTest.level-1)*12.5));MKHCAS_STATE.testResults.kata=score;MKHCAS_STATE.scores.kata=score;document.querySelector('[data-test="kata"]').classList.add('mkhcas-completed');document.getElementById('pattern-status').textContent='スコア: '+score+'点(最高レベル: '+(patternTest.level-1)+')';document.getElementById('pattern-start-btn').disabled=false;document.getElementById('pattern-start-btn').textContent='再テスト';checkAllTestsComplete();} function renderBalanceTestDiag(container){container.innerHTML='
バランス制御テスト
スマートフォンを腰付近に固定し、30秒間片脚立ちを維持してください
センサー準備中...
30
動揺面積
';checkSensorAvailability('balance-test');} function checkSensorAvailability(prefix){if(window.DeviceMotionEvent){if(typeof DeviceMotionEvent.requestPermission==='function'){document.getElementById(prefix+'-sensor-text').textContent='タップして許可';}else{document.getElementById(prefix+'-sensor').classList.add('mkhcas-active');document.getElementById(prefix+'-sensor-text').textContent='センサー利用可能';}}else{document.getElementById(prefix+'-sensor-text').textContent='センサー非対応';}} function startBalanceTestDiag(){if(balanceTestDiag.running)return;if(typeof DeviceMotionEvent!=='undefined'&&typeof DeviceMotionEvent.requestPermission==='function'){DeviceMotionEvent.requestPermission().then(function(response){if(response==='granted'){runBalanceTestDiag();}});}else if(window.DeviceMotionEvent){runBalanceTestDiag();}else{alert('このデバイスではモーションセンサーを利用できません');}} function runBalanceTestDiag(){balanceTestDiag={running:true,data:[],interval:null,countdown:30};document.getElementById('balance-test-btn').disabled=true;document.getElementById('balance-test-sensor').classList.add('mkhcas-active');document.getElementById('balance-test-sensor-text').textContent='計測中...';var dot=document.getElementById('balance-test-dot');function handleMotion(e){if(!balanceTestDiag.running)return;var x=e.accelerationIncludingGravity.x||0;var y=e.accelerationIncludingGravity.y||0;balanceTestDiag.data.push({x:x,y:y,t:Date.now()});var dotX=100+x*8;var dotY=100+y*8;dotX=Math.max(8,Math.min(192,dotX));dotY=Math.max(8,Math.min(192,dotY));dot.style.left=dotX+'px';dot.style.top=dotY+'px';}window.addEventListener('devicemotion',handleMotion);balanceTestDiag.interval=setInterval(function(){balanceTestDiag.countdown--;document.getElementById('balance-test-timer').textContent=balanceTestDiag.countdown;if(balanceTestDiag.countdown=10){var sumX=0,sumY=0;data.forEach(function(d){sumX+=d.x;sumY+=d.y;});var avgX=sumX/data.length;var avgY=sumY/data.length;var variance=0;data.forEach(function(d){variance+=Math.pow(d.x-avgX,2)+Math.pow(d.y-avgY,2);});variance/=data.length;score=Math.max(0,Math.min(100,Math.round(100-variance*5)));}MKHCAS_STATE.testResults.hara=score;MKHCAS_STATE.scores.hara=score;document.querySelector('[data-test="hara"]').classList.add('mkhcas-completed');document.getElementById('balance-test-area').textContent=score+'点';document.getElementById('balance-test-btn').disabled=false;document.getElementById('balance-test-btn').textContent='再テスト';document.getElementById('balance-test-sensor-text').textContent='計測完了';checkAllTestsComplete();} function renderPhaseTest(container){var html='
守破離フェーズ診断
各質問に対して最も当てはまるものを選んでください
';PHASE_QUESTIONS.forEach(function(q,qIdx){html+='
'+(qIdx+1)+'. '+q.text+'
';q.options.forEach(function(opt){html+='';});html+='
';});html+='
';container.innerHTML=html;} function submitPhaseTest(){var scores={shu:0,ha:0,ri:0};var allAnswered=true;PHASE_QUESTIONS.forEach(function(q,qIdx){var selected=document.querySelector('input[name="phase-q'+qIdx+'"]:checked');if(selected){scores[selected.value]++;}else{allAnswered=false;}});if(!allAnswered){alert('すべての質問に回答してください');return;}var phase='shu';if(scores.ri>=scores.ha&&scores.ri>=scores.shu)phase='ri';else if(scores.ha>=scores.shu)phase='ha';MKHCAS_STATE.testResults.phase=phase;MKHCAS_STATE.phase=phase;document.querySelector('[data-test="phase"]').classList.add('mkhcas-completed');checkAllTestsComplete();} function checkAllTestsComplete(){var complete=MKHCAS_STATE.testResults.ma!==null&&MKHCAS_STATE.testResults.kata!==null&&MKHCAS_STATE.testResults.hara!==null&&MKHCAS_STATE.testResults.phase!==null;if(complete){showDiagnosticResult();}} function showDiagnosticResult(){var resultArea=document.getElementById('mkhcas-diagnostic-result');resultArea.style.display='block';var phaseNames={shu:'守',ha:'破',ri:'離'};var phaseDescs={shu:'基礎固めの段階です。型を忠実に学び、基本的な神経回路を構築しましょう。',ha:'カオスの縁に立っています。意図的なゆらぎを導入し、自己組織化を促進しましょう。',ri:'高い統合レベルにあります。無心の状態で創発的なパフォーマンスを発揮できます。'};document.getElementById('mkhcas-result-phase').textContent=phaseNames[MKHCAS_STATE.phase];document.getElementById('mkhcas-result-phase-name').textContent=phaseNames[MKHCAS_STATE.phase]+'フェーズ';document.getElementById('mkhcas-result-desc').textContent=phaseDescs[MKHCAS_STATE.phase];document.getElementById('mkhcas-ma-score').textContent=MKHCAS_STATE.scores.ma;document.getElementById('mkhcas-kata-score').textContent=MKHCAS_STATE.scores.kata;document.getElementById('mkhcas-hara-score').textContent=MKHCAS_STATE.scores.hara;document.getElementById('mkhcas-ma-bar').style.width=MKHCAS_STATE.scores.ma+'%';document.getElementById('mkhcas-kata-bar').style.width=MKHCAS_STATE.scores.kata+'%';document.getElementById('mkhcas-hara-bar').style.width=MKHCAS_STATE.scores.hara+'%';renderRadarChart();renderRecommendations();updateStatusBar();resultArea.scrollIntoView({behavior:'smooth'});} function renderRadarChart(){var container=document.getElementById('mkhcas-radar-chart');var centerX=160,centerY=130,radius=100;var angles=[-90,150,30];var labels=['間','腹','型'];var values=[MKHCAS_STATE.scores.ma,MKHCAS_STATE.scores.hara,MKHCAS_STATE.scores.kata];var points=values.map(function(v,i){var angle=angles[i]*Math.PI/180;var r=radius*(v/100);return{x:centerX+r*Math.cos(angle),y:centerY+r*Math.sin(angle)};});var svg='';for(var level=1;level';}angles.forEach(function(a,i){var angle=a*Math.PI/180;var endX=centerX+radius*Math.cos(angle);var endY=centerY+radius*Math.sin(angle);svg+='';var labelX=centerX+(radius+25)*Math.cos(angle);var labelY=centerY+(radius+25)*Math.sin(angle);svg+=''+labels[i]+'';});var dataPoints=points.map(function(p){return p.x+','+p.y;}).join(' ');svg+='';points.forEach(function(p){svg+='';});svg+='';container.innerHTML=svg;} function renderRecommendations(){var list=document.getElementById('mkhcas-recommendations');var recs=[];if(MKHCAS_STATE.phase==='shu'){recs=['基本姿勢確立(腹の安定化)','型の反復練習(メトロノーム60BPM)','閉眼バランスで固有感覚強化','GETTA L1-L3プロトコル'];}else if(MKHCAS_STATE.phase==='ha'){recs=['リズム変調トレーニング','制約操作による創発的解決','デュアルタスクで型の自動化確認','GETTA L4-L6プロトコル'];}else{recs=['自由即興でフロー状態を体験','ゲーム形式での実践','瞑想的動作で腹からの動きを体得','GETTA L7-L8プロトコル'];}if(MKHCAS_STATE.scores.ma'+r+'';}).join('');} function updateStatusBar(){var phaseNames={shu:'守',ha:'破',ri:'離'};document.getElementById('mkhcas-phase-display').textContent=MKHCAS_STATE.phase?phaseNames[MKHCAS_STATE.phase]:'―';var casScore=Math.round((MKHCAS_STATE.scores.ma+MKHCAS_STATE.scores.kata+MKHCAS_STATE.scores.hara)/3);document.getElementById('mkhcas-cas-score').textContent=casScore||'―';} function renderTrainingList(){var container=document.getElementById('mkhcas-training-list');var filtered=MKHCAS_STATE.trainingFilter==='all'?TRAINING_DATA:TRAINING_DATA.filter(function(t){return t.phase===MKHCAS_STATE.trainingFilter;});container.innerHTML=filtered.map(function(t){var phaseClass='mkhcas-'+t.phase;var phaseLabel={shu:'守',ha:'破',ri:'離'}[t.phase];return '
'+phaseLabel+''+t.name+'
⏱ '+t.duration+'🎯 '+t.focus+'
'+t.desc+'
';}).join('');} function filterTraining(filter){MKHCAS_STATE.trainingFilter=filter;['all','shu','ha','ri'].forEach(function(f){var btn=document.getElementById('filter-'+f);if(f===filter){btn.classList.remove('mkhcas-btn-secondary');}else{btn.classList.add('mkhcas-btn-secondary');}});renderTrainingList();} function selectTraining(id){MKHCAS_STATE.selectedTraining=TRAINING_DATA.find(function(t){return t.id===id;});var items=document.querySelectorAll('.mkhcas-training-item');items.forEach(function(item){item.classList.remove('mkhcas-active');});event.currentTarget.classList.add('mkhcas-active');var detail=document.getElementById('mkhcas-training-detail');detail.style.display='block';document.getElementById('training-detail-title').textContent=MKHCAS_STATE.selectedTraining.name;document.getElementById('training-detail-content').innerHTML='

'+MKHCAS_STATE.selectedTraining.detail+'

所要時間
'+MKHCAS_STATE.selectedTraining.duration+'
フォーカス
'+MKHCAS_STATE.selectedTraining.focus+'
';detail.scrollIntoView({behavior:'smooth'});} function startTrainingSession(){if(!MKHCAS_STATE.selectedTraining)return;MKHCAS_STATE.sessions++;document.getElementById('mkhcas-sessions').textContent=MKHCAS_STATE.sessions;showSection('practice');showTool('timer');alert(MKHCAS_STATE.selectedTraining.name+' を開始します。タイマーを使って練習時間を計測してください。');} function renderGettaProtocols(){var container=document.getElementById('mkhcas-getta-protocols');container.innerHTML=GETTA_PROTOCOLS.map(function(p){var phaseClass='mkhcas-'+p.phase;return '
L'+p.level+'
'+p.name+' '+ {shu:'守',ha:'破',ri:'離'}[p.phase]+'
'+p.desc+' ('+p.duration+')
';}).join('');} function selectGetta(level){MKHCAS_STATE.selectedGetta=GETTA_PROTOCOLS.find(function(p){return p.level===level;});var items=document.querySelectorAll('.mkhcas-getta-level');items.forEach(function(item){item.classList.remove('mkhcas-active');});event.currentTarget.classList.add('mkhcas-active');var detail=document.getElementById('mkhcas-getta-detail');detail.style.display='block';document.getElementById('getta-detail-title').textContent='L'+MKHCAS_STATE.selectedGetta.level+': '+MKHCAS_STATE.selectedGetta.name;document.getElementById('getta-detail-content').innerHTML='

'+MKHCAS_STATE.selectedGetta.detail+'

所要時間
'+MKHCAS_STATE.selectedGetta.duration+'
対象フェーズ
'+ {shu:'守',ha:'破',ri:'離'}[MKHCAS_STATE.selectedGetta.phase]+'
';detail.scrollIntoView({behavior:'smooth'});} function startGettaSession(){if(!MKHCAS_STATE.selectedGetta)return;MKHCAS_STATE.sessions++;document.getElementById('mkhcas-sessions').textContent=MKHCAS_STATE.sessions;showSection('practice');showTool('timer');alert('GETTA L'+MKHCAS_STATE.selectedGetta.level+': '+MKHCAS_STATE.selectedGetta.name+' を開始します。');} function showTool(toolName){var tools=document.querySelectorAll('.mkhcas-tool-content');var btns=document.querySelectorAll('.mkhcas-tool-btn');tools.forEach(function(t){t.classList.remove('mkhcas-active');});btns.forEach(function(b){b.classList.remove('mkhcas-active');});document.getElementById('tool-'+toolName).classList.add('mkhcas-active');document.querySelector('[data-tool="'+toolName+'"]').classList.add('mkhcas-active');MKHCAS_STATE.currentTool=toolName;if(toolName==='balance'){checkSensorAvailability('mkhcas');}} function timerStart(){if(MKHCAS_STATE.timer.running)return;MKHCAS_STATE.timer.running=true;MKHCAS_STATE.timer.interval=setInterval(function(){if(MKHCAS_STATE.timer.mode==='up'){MKHCAS_STATE.timer.seconds++;}else{MKHCAS_STATE.timer.seconds--;if(MKHCAS_STATE.timer.seconds0?'down':'up';updateTimerDisplay();} function timerPreset(seconds){timerPause();MKHCAS_STATE.timer.target=seconds;MKHCAS_STATE.timer.seconds=seconds;MKHCAS_STATE.timer.mode='down';updateTimerDisplay();} function updateTimerDisplay(){var mins=Math.floor(MKHCAS_STATE.timer.seconds/60);var secs=MKHCAS_STATE.timer.seconds%60;document.getElementById('mkhcas-timer-display').textContent=String(mins).padStart(2,'0')+':'+String(secs).padStart(2,'0');} function updateBPM(value){MKHCAS_STATE.metronome.bpm=parseInt(value);document.getElementById('mkhcas-bpm-display').textContent=value;if(MKHCAS_STATE.metronome.running){toggleMetronome();toggleMetronome();}} function toggleMetronome(){var btn=document.getElementById('mkhcas-metro-btn');var visual=document.getElementById('mkhcas-metro-visual');if(MKHCAS_STATE.metronome.running){clearInterval(MKHCAS_STATE.metronome.interval);MKHCAS_STATE.metronome.interval=null;MKHCAS_STATE.metronome.running=false;btn.textContent='開始';}else{var interval=60000/MKHCAS_STATE.metronome.bpm;MKHCAS_STATE.metronome.running=true;btn.textContent='停止';function tick(){playClick();visual.classList.add('mkhcas-beat');setTimeout(function(){visual.classList.remove('mkhcas-beat');},100);}tick();MKHCAS_STATE.metronome.interval=setInterval(tick,interval);}} function playClick(){try{var ctx=new(window.AudioContext||window.webkitAudioContext)();var osc=ctx.createOscillator();var gain=ctx.createGain();osc.connect(gain);gain.connect(ctx.destination);osc.frequency.value=800;osc.type='sine';gain.gain.setValueAtTime(0.3,ctx.currentTime);gain.gain.exponentialRampToValueAtTime(0.01,ctx.currentTime+0.1);osc.start(ctx.currentTime);osc.stop(ctx.currentTime+0.1);}catch(e){}} function playBeep(){try{var ctx=new(window.AudioContext||window.webkitAudioContext)();var osc=ctx.createOscillator();var gain=ctx.createGain();osc.connect(gain);gain.connect(ctx.destination);osc.frequency.value=440;osc.type='sine';gain.gain.setValueAtTime(0.5,ctx.currentTime);osc.start(ctx.currentTime);osc.stop(ctx.currentTime+0.5);}catch(e){}} function toggleBreathing(){var btn=document.getElementById('mkhcas-breath-btn');var circle=document.getElementById('mkhcas-breath-circle');var phaseText=document.getElementById('mkhcas-breath-phase');if(MKHCAS_STATE.breathing.running){clearTimeout(MKHCAS_STATE.breathing.interval);MKHCAS_STATE.breathing.interval=null;MKHCAS_STATE.breathing.running=false;btn.textContent='開始';circle.className='mkhcas-breath-circle';circle.textContent='準備';phaseText.textContent='ボタンを押して開始';}else{MKHCAS_STATE.breathing.running=true;MKHCAS_STATE.breathing.phase=0;btn.textContent='停止';var pattern=BREATH_PATTERNS[MKHCAS_STATE.breathing.pattern];function nextPhase(){var p=pattern.phases[MKHCAS_STATE.breathing.phase];circle.textContent=p.name;phaseText.textContent=pattern.name+'呼吸 - '+p.name;circle.classList.remove('mkhcas-inhale','mkhcas-hold');if(p.name==='吸う')circle.classList.add('mkhcas-inhale');else if(p.name==='止める')circle.classList.add('mkhcas-hold');MKHCAS_STATE.breathing.phase=(MKHCAS_STATE.breathing.phase+1)%pattern.phases.length;MKHCAS_STATE.breathing.interval=setTimeout(nextPhase,p.duration);}nextPhase();}} function setBreathPattern(pattern){MKHCAS_STATE.breathing.pattern=pattern;if(MKHCAS_STATE.breathing.running){toggleBreathing();toggleBreathing();}} function startBalanceTest(){var btn=document.getElementById('mkhcas-balance-btn');if(MKHCAS_STATE.balance.running){MKHCAS_STATE.balance.running=false;btn.textContent='計測開始';return;}if(typeof DeviceMotionEvent!=='undefined'&&typeof DeviceMotionEvent.requestPermission==='function'){DeviceMotionEvent.requestPermission().then(function(response){if(response==='granted'){runBalanceMeasurement();}});}else if(window.DeviceMotionEvent){runBalanceMeasurement();}else{alert('このデバイスではモーションセンサーを利用できません');}} function runBalanceMeasurement(){MKHCAS_STATE.balance.running=true;MKHCAS_STATE.balance.data=[];MKHCAS_STATE.balance.startTime=Date.now();document.getElementById('mkhcas-balance-btn').textContent='計測中...';document.getElementById('mkhcas-sensor-dot').classList.add('mkhcas-active');document.getElementById('mkhcas-sensor-text').textContent='計測中';var dot=document.getElementById('mkhcas-balance-dot');var visual=document.getElementById('mkhcas-balance-visual');var centerX=visual.offsetWidth/2;var centerY=visual.offsetHeight/2;function handleMotion(e){if(!MKHCAS_STATE.balance.running)return;var x=e.accelerationIncludingGravity.x||0;var y=e.accelerationIncludingGravity.y||0;MKHCAS_STATE.balance.data.push({x:x,y:y,t:Date.now()});var dotX=centerX+x*10;var dotY=centerY+y*10;dotX=Math.max(8,Math.min(visual.offsetWidth-8,dotX));dotY=Math.max(8,Math.min(visual.offsetHeight-8,dotY));dot.style.left=dotX+'px';dot.style.top=dotY+'px';if(Date.now()-MKHCAS_STATE.balance.startTime>10000){MKHCAS_STATE.balance.running=false;window.removeEventListener('devicemotion',handleMotion);calculateBalanceResults();}}window.addEventListener('devicemotion',handleMotion);} function calculateBalanceResults(){var data=MKHCAS_STATE.balance.data;document.getElementById('mkhcas-balance-btn').textContent='計測開始';document.getElementById('mkhcas-sensor-text').textContent='計測完了';if(data.lengthまだ記録がありません';return;}container.innerHTML=MKHCAS_STATE.journal.slice(0,5).map(function(e){return '
'+e.date+' | フェーズ: '+e.phase+'
'+e.text+'
';}).join('');} function downloadJournal(){var text=document.getElementById('mkhcas-journal').value.trim();var allEntries=MKHCAS_STATE.journal.map(function(e){return '【'+e.date+'】\nフェーズ: '+e.phase+'\n'+e.text;}).join('\n\n---\n\n');if(text){allEntries='【現在の入力】\n'+text+'\n\n---\n\n'+allEntries;}if(!allEntries){alert('ダウンロードする記録がありません');return;}var header='MKH-CAS 練習ジャーナル\nエクスポート日時: '+new Date().toLocaleString('ja-JP')+'\n現在フェーズ: '+(MKHCAS_STATE.phase?{shu:'守',ha:'破',ri:'離'}[MKHCAS_STATE.phase]:'未診断')+'\nCASスコア: 間'+MKHCAS_STATE.scores.ma+' / 型'+MKHCAS_STATE.scores.kata+' / 腹'+MKHCAS_STATE.scores.hara+'\n\n===================\n\n';var content=header+allEntries;var blob=new Blob([content],{type:'text/plain;charset=utf-8'});var url=URL.createObjectURL(blob);var a=document.createElement('a');a.href=url;a.download='mkhcas-journal-'+new Date().toISOString().split('T')[0]+'.txt';a.click();URL.revokeObjectURL(url);} function closeModal(){document.getElementById('mkhcas-modal').classList.remove('mkhcas-show');} document.addEventListener('DOMContentLoaded',init); window.MKHCAS={showSection:showSection,selectTest:selectTest,startRhythmTest:startRhythmTest,startPatternTest:startPatternTest,startBalanceTestDiag:startBalanceTestDiag,submitPhaseTest:submitPhaseTest,filterTraining:filterTraining,selectTraining:selectTraining,startTrainingSession:startTrainingSession,selectGetta:selectGetta,startGettaSession:startGettaSession,showTool:showTool,timerStart:timerStart,timerPause:timerPause,timerReset:timerReset,timerPreset:timerPreset,updateBPM:updateBPM,toggleMetronome:toggleMetronome,toggleBreathing:toggleBreathing,setBreathPattern:setBreathPattern,startBalanceTest:startBalanceTest,saveJournal:saveJournal,downloadJournal:downloadJournal,closeModal:closeModal}; })();
PAGE TOP