<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GarageBand | imakat.com</title>
	<atom:link href="https://imakat.com/tag/garageband/feed/" rel="self" type="application/rss+xml" />
	<link>https://imakat.com</link>
	<description>工夫と改善で人生をちょっと豊かに</description>
	<lastBuildDate>Fri, 25 Sep 2026 22:46:10 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://i0.wp.com/imakat.com/wp-content/uploads/2023/07/cropped-80d64ecd340db4e2ca3224859b04caed.png?fit=32%2C32&#038;ssl=1</url>
	<title>GarageBand | imakat.com</title>
	<link>https://imakat.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">160909258</site>	<item>
		<title>【AIと自作】マイギターコードアプリが完成！～複雑なDAWを補う「自分専用の介助ロボット」～</title>
		<link>https://imakat.com/2026/07/23/29494/</link>
		
		<dc:creator><![CDATA[imakat]]></dc:creator>
		<pubDate>Thu, 23 Jul 2026 05:25:42 +0000</pubDate>
				<category><![CDATA[音楽制作]]></category>
		<category><![CDATA[cubase]]></category>
		<category><![CDATA[DAW]]></category>
		<category><![CDATA[GarageBand]]></category>
		<category><![CDATA[MIDI]]></category>
		<guid isPermaLink="false">https://imakat.com/?p=29494</guid>

					<description><![CDATA[はじめに&#160; 曲に豊かな表情をつける方法の一つに「和音の工夫」があります。今や生成AIが自動的に曲を作ってくれる時代ですが、AIが作った曲は何度聴いても心に刺さらない…そう感じるのは私だけではないはずです。 やは [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading"><strong>はじめに</strong>&nbsp;</h2>



<p class="wp-block-paragraph">曲に豊かな表情をつける方法の一つに「和音の工夫」があります。今や生成AIが自動的に曲を作ってくれる時代ですが、AIが作った曲は何度聴いても心に刺さらない…そう感じるのは私だけではないはずです。 やはり自分で和音を工夫して音楽を作りたい。そう思ってDAW（CubaseやGarageBand）に向かうのですが、高齢になってくると、ますます複雑化するDAWの操作がどんどん億劫になってしまいます。特にDAWには「ギターの指板型エディタ」が搭載されていません。高機能なギター音源（Ample Soundなど）を使えば指板入力も可能ですが、そこへ辿り着くまでの操作すら遠く感じてしまいます。</p>



<p class="wp-block-paragraph">「複雑怪奇な装置から、自分に必要なことだけを抜き出した簡単な仕組みを作りたい。まるで介助ロボットのようなアプリが欲しい」。そんな思いから、生成AIの力を借りて、Macで動く自分専用の「マイギターコードアプリ（Python/Tkinter）」を自作しました。</p>


<div class="sc-dynamic-embed">
  <style>
  /* リンクの見た目を整える */
  .sc-dynamic-embed .sc-link-container { 
      display: flex; 
      margin-bottom: 10px; 
      flex-wrap: wrap; 
      align-items: center; 
  }
  .sc-dynamic-embed .sc-link { margin-bottom: 0; }
  .sc-dynamic-embed .sc-link a {
    font-size: 15px; 
    font-weight: normal;
    text-decoration: underline;
    color: #0073aa;
  }
  .sc-dynamic-embed .sc-link a:hover { text-decoration: none; color: #000; }
  
  @media (max-width: 500px) {
    .sc-dynamic-embed .sc-link a { font-size: 13px; }
  }

  .sc-dynamic-embed .imk-line {
      display: inline-block;
      width: 100%;
      border-radius: 2px;
      transition: background-color 0.1s;
  }

  .sc-dynamic-embed #subtitleOverlay,
  .sc-dynamic-embed #scSubtitleOverlay,
  .sc-dynamic-embed .overlay-cue,
  .sc-dynamic-embed .band {
      display: none !important;
      opacity: 0 !important;
      visibility: hidden !important;
      pointer-events: none !important;
  }
  </style>

  <div class="sc-link-container">
    <p class="sc-link">
      <!-- ★環境依存排除：固定ドメインをルート相対パスへ置換完了 -->
      <a href="/ds62/?drid=103" target="_blank"
         onclick="return scStopAndGo(event, this);">
        👉低画質・枠外字幕はこちら
      </a>
    </p>
  </div>

  <!-- ★環境依存排除：[dynamic_external_html] にルート相対パスを指定し、functions.phpにURL動的解決を委ねる設計 -->
  <style>
            :root{ --dr5emd-max: 1920px; }
            #subtitleOverlay, #scSubtitleOverlay, .overlay-cue, .band { display: none !important; opacity: 0 !important; }
            .imk-line { display: inline-block; width: 100%; border-radius: 2px; transition: background-color 0.1s; }
            .dr5emd-sublist details > p{ height:200px; overflow:auto; background-color:#EDF7FF; padding:2px 6px; margin:0; box-shadow:3px 3px 4px black; position: relative; }
            .dr5emd-sublist details > summary{ padding:2px 6px; width:100%; background-color:#ddd; border:none; box-shadow:3px 3px 4px black; cursor:pointer; list-style:none; }
            
                .video-wrap{position:relative;width:100%;margin:0 auto}
                #myVideo{width:100%;height:auto;min-height:200px;display:block;background:#000;}</style><div class="dr5emd-container"><div class="video-wrap"><video id="myVideo" controls poster="https://imakat.com/rd.php?id=Gdd8CbQw.png" playsinline preload="none" style="width:100%;height:auto;">  <source src="https://imakat.com/rd.php?id=cqpz01Dy.mp4" type="video/mp4">  <track src="https://imakat.com/rd.php?id=JnBGdEPn.vtt" label="日本語" srclang="ja" kind="subtitles"></video></div><div class="dr5emd-sublist"><details translate="yes"><summary translate="yes">字幕一覧(クリック)</summary> <p translate="yes">
(<a href="#" class="imk-cue" data-seek="0:00" translate="no">00:00:00</a>) 〜マイギターコードアプリの作成〜今回は、コードはコードでも、ギターのコードの作成というテーマです。<br>
(<a href="#" class="imk-cue" data-seek="0:08" translate="no">00:00:08</a>) 曲に表情をつける方法の1つに、和音の工夫があります。<br>
(<a href="#" class="imk-cue" data-seek="0:16" translate="no">00:00:16</a>) 和音の構成も、今や生成AIが自動的に作ってくれる時代になっています。<br>
(<a href="#" class="imk-cue" data-seek="0:26" translate="no">00:00:26</a>) ただし、生成AIで作った曲は何度聴いても心に刺さらない。<br>
(<a href="#" class="imk-cue" data-seek="0:34" translate="no">00:00:34</a>) そういうふうに感じるのは、私だけではないはずです。<br>
(<a href="#" class="imk-cue" data-seek="0:41" translate="no">00:00:41</a>) 久しぶりに昔のように自分で音楽を作ろうと思ってCubaseに向かうのですが、<br>
(<a href="#" class="imk-cue" data-seek="0:49" translate="no">00:00:49</a>) こっちがどんどん高齢になって頭が弱くなっているところへ輪をかけて、<br>
(<a href="#" class="imk-cue" data-seek="0:56" translate="no">00:00:56</a>) 最近のDAWはますます複雑になってきています。<br>
(<a href="#" class="imk-cue" data-seek="1:03" translate="no">00:01:03</a>) だから、どんどん億劫になってしまう。<br>
(<a href="#" class="imk-cue" data-seek="1:08" translate="no">00:01:08</a>) この複雑怪奇な装置やアプリから、必要なことだけを抜き出して、<br>
(<a href="#" class="imk-cue" data-seek="1:15" translate="no">00:01:15</a>) 簡単な仕組みを作ることができればいいわけですね。<br>
(<a href="#" class="imk-cue" data-seek="1:21" translate="no">00:01:21</a>) だから、介護ロボットとか介助ロボットのようなものが欲しいわけです。<br>
(<a href="#" class="imk-cue" data-seek="1:28" translate="no">00:01:28</a>) それを自分で作るということです。<br>
(<a href="#" class="imk-cue" data-seek="1:32" translate="no">00:01:32</a>) そこに力を貸してくれるのが、生成AIなのですね。<br>
(<a href="#" class="imk-cue" data-seek="1:38" translate="no">00:01:38</a>) 1つ1つの音をノートと言いますけれども、<br>
(<a href="#" class="imk-cue" data-seek="1:44" translate="no">00:01:44</a>) そのノートをトラックに書き込む道具をエディターと言いますが、<br>
(<a href="#" class="imk-cue" data-seek="1:50" translate="no">00:01:50</a>) DAWはキーエディター、ドラムエディター、<br>
(<a href="#" class="imk-cue" data-seek="1:56" translate="no">00:01:56</a>) スコアエディターの3つは用意されているんですが、<br>
(<a href="#" class="imk-cue" data-seek="2:01" translate="no">00:02:01</a>) ギターの指板エディターは、<br>
(<a href="#" class="imk-cue" data-seek="2:06" translate="no">00:02:06</a>) 少なくともCubase、GarageBandには搭載されていません。<br>
(<a href="#" class="imk-cue" data-seek="2:13" translate="no">00:02:13</a>) そこで掘り下げてギター音源アプリに注目すると、有名なものにAmple Soundがあります。<br>
(<a href="#" class="imk-cue" data-seek="2:25" translate="no">00:02:25</a>) Ample Soundの中の、Strumという機能の中に、指板をポチポチ押して、<br>
(<a href="#" class="imk-cue" data-seek="2:39" translate="no">00:02:39</a>) ここのところですね。さらにストロークの長さを決めると。<br>
(<a href="#" class="imk-cue" data-seek="2:47" translate="no">00:02:47</a>) そういう仕組みがあるので、これを使うという方法はあります。<br>
(<a href="#" class="imk-cue" data-seek="2:54" translate="no">00:02:54</a>) しかし、なんか遠いんですね、そこまでが。<br>
(<a href="#" class="imk-cue" data-seek="3:00" translate="no">00:03:00</a>) 私が作りたいこと、つまり介助アプリに求めることは3点です。<br>
(<a href="#" class="imk-cue" data-seek="3:08" translate="no">00:03:08</a>) 指板を押しながら和音を作る、そのコードネームを調べる、DAWへMIDI出力する。<br>
(<a href="#" class="imk-cue" data-seek="3:20" translate="no">00:03:20</a>) こういった3点だけですね。そんな単純な仕組みを作りたいんです。<br>
(<a href="#" class="imk-cue" data-seek="3:28" translate="no">00:03:28</a>) それでアプリ作りにはいったんですが、介助アプリと言ったらいいですかね。<br>
(<a href="#" class="imk-cue" data-seek="3:39" translate="no">00:03:39</a>) マイギターコードアプリですが、これを作るのにお金はかかりません。<br>
(<a href="#" class="imk-cue" data-seek="3:46" translate="no">00:03:46</a>) Mac標準のGarageBandがあればいいです。<br>
(<a href="#" class="imk-cue" data-seek="3:52" translate="no">00:03:52</a>) 私はCubaseを使いますが、GarageBandやCubaseのことをDAWと呼びます。<br>
(<a href="#" class="imk-cue" data-seek="4:05" translate="no">00:04:05</a>) 介助アプリの機能は、指の位置からコードネームを取得する。<br>
(<a href="#" class="imk-cue" data-seek="4:16" translate="no">00:04:16</a>) 押さえた場所の音を再現する。押さえた指板の画像を作成する。<br>
(<a href="#" class="imk-cue" data-seek="4:24" translate="no">00:04:24</a>) 生成AIへコードネームの調査を依頼して取得、登録をする。<br>
(<a href="#" class="imk-cue" data-seek="4:31" translate="no">00:04:31</a>) DAWへMIDIの出力をする。以上になります。<br>
(<a href="#" class="imk-cue" data-seek="4:39" translate="no">00:04:39</a>) それでは次に、具体的にアプリの動きを説明します。<br>
(<a href="#" class="imk-cue" data-seek="4:46" translate="no">00:04:46</a>) アプリを立ち上げますと、最初は追加モードでスタートします。<br>
(<a href="#" class="imk-cue" data-seek="4:57" translate="no">00:04:57</a>) それで、指板のボタンを押すと音が出ます。<br>
(<a href="#" class="imk-cue" data-seek="5:08" translate="no">00:05:08</a>) Shiftを押しながらボタンを押すと、和音で音が出ます。<br>
(<a href="#" class="imk-cue" data-seek="5:14" translate="no">00:05:14</a>) そうやって指の位置を決めていきます。<br>
(<a href="#" class="imk-cue" data-seek="5:20" translate="no">00:05:20</a>) その指の位置を決めたら、2番目に指の位置確認ボタンを押します。<br>
(<a href="#" class="imk-cue" data-seek="5:34" translate="no">00:05:34</a>) すると、a-ki's factoryというサイトからコードネームを取得します。<br>
(<a href="#" class="imk-cue" data-seek="5:41" translate="no">00:05:41</a>) こういうサイトですね。ここのサイトのところに、<br>
(<a href="#" class="imk-cue" data-seek="5:46" translate="no">00:05:46</a>) コードネームが出るんですね。ルート順、適合順ということで出ます。<br>
(<a href="#" class="imk-cue" data-seek="5:56" translate="no">00:05:56</a>) この情報を取得して、サイト提供コードネームというところに表示します。<br>
(<a href="#" class="imk-cue" data-seek="6:06" translate="no">00:06:06</a>) 次に4番目にギターの音が出力されます。<br>
(<a href="#" class="imk-cue" data-seek="6:12" translate="no">00:06:12</a>) 5番目に、指板プレビューが表示されます。こういうやつです。<br>
(<a href="#" class="imk-cue" data-seek="6:18" translate="no">00:06:18</a>) C欄に自分調査コードネームというところがあります。というのは、<br>
(<a href="#" class="imk-cue" data-seek="6:29" translate="no">00:06:29</a>) ベース音を追加した分数コードの形で解釈ができないこともあって、<br>
(<a href="#" class="imk-cue" data-seek="6:38" translate="no">00:06:38</a>) コードネームなしとなることも結構あります。<br>
(<a href="#" class="imk-cue" data-seek="6:44" translate="no">00:06:44</a>) そこで、生成AIのGemを使って、分数コードを含めたコードネームを解析してもらいます。<br>
(<a href="#" class="imk-cue" data-seek="6:54" translate="no">00:06:54</a>) Gemに貼り付ける画像は、指板プレビューに出てくるものをスクショして、<br>
(<a href="#" class="imk-cue" data-seek="7:04" translate="no">00:07:04</a>) ここにペーストするのが楽です。<br>
(<a href="#" class="imk-cue" data-seek="7:11" translate="no">00:07:11</a>) そしてその結果が、このように表示されます。<br>
(<a href="#" class="imk-cue" data-seek="7:17" translate="no">00:07:17</a>) その中身を見て、必要に応じてC欄に書き込みます。<br>
(<a href="#" class="imk-cue" data-seek="7:24" translate="no">00:07:24</a>) それでは次に変更モードに入ります。変更モードを選ぶと、<br>
(<a href="#" class="imk-cue" data-seek="7:32" translate="no">00:07:32</a>) 画像ファイルの選択を通じてコードが選択できるようになって、<br>
(<a href="#" class="imk-cue" data-seek="7:39" translate="no">00:07:39</a>) このC欄の修正だとか、さらにMIDIの出力ができるようになります。<br>
(<a href="#" class="imk-cue" data-seek="7:48" translate="no">00:07:48</a>) 一覧のサムネイルから、あるいはリストから、指板画像ファイルを選ぶことができます。<br>
(<a href="#" class="imk-cue" data-seek="8:00" translate="no">00:08:00</a>) サムネイル型ですけれども、残念ながらこのサムネイルの拡大が、<br>
(<a href="#" class="imk-cue" data-seek="8:08" translate="no">00:08:08</a>) MacOS標準では困難ということで、<br>
(<a href="#" class="imk-cue" data-seek="8:14" translate="no">00:08:14</a>) この場所では少し我慢するしかないです。<br>
(<a href="#" class="imk-cue" data-seek="8:20" translate="no">00:08:20</a>) 音楽制作を続けている中でしたら、その画像がそれほど遠くない場所に、<br>
(<a href="#" class="imk-cue" data-seek="8:27" translate="no">00:08:27</a>) 固まって近くにあると思うので、欲しいサムネイルが見つかるはずです。<br>
(<a href="#" class="imk-cue" data-seek="8:34" translate="no">00:08:34</a>) それほどのストレスにはならないと思います。<br>
(<a href="#" class="imk-cue" data-seek="8:39" translate="no">00:08:39</a>) コードネームを指定する時の悩みですけれども、<br>
(<a href="#" class="imk-cue" data-seek="8:45" translate="no">00:08:45</a>) 前に作ったあの和音はどこにある？と探すのが結構面倒ですよね。<br>
(<a href="#" class="imk-cue" data-seek="8:51" translate="no">00:08:51</a>) コードネームからの音の表情はなんとか連想はできるのですが、<br>
(<a href="#" class="imk-cue" data-seek="8:57" translate="no">00:08:57</a>) 指板の方が音の表情は、より豊かに連想ができます。<br>
(<a href="#" class="imk-cue" data-seek="9:03" translate="no">00:09:03</a>) 結局、実際に指を置いて出せる音なので、<br>
(<a href="#" class="imk-cue" data-seek="9:10" translate="no">00:09:10</a>) 指が疲れる押さえ方だなとか、体の動きと出てくる音が、<br>
(<a href="#" class="imk-cue" data-seek="9:17" translate="no">00:09:17</a>) 自分の脳のどこかに記憶されているわけですね。<br>
(<a href="#" class="imk-cue" data-seek="9:24" translate="no">00:09:24</a>) そこで単発的な使い方にはなるんですけれども、ご覧のFinderから(サムネイルが拡大できます！)、<br>
(<a href="#" class="imk-cue" data-seek="9:32" translate="no">00:09:32</a>) 指板画像のファイルの入っているフォルダを開いて、<br>
(<a href="#" class="imk-cue" data-seek="9:38" translate="no">00:09:38</a>) その中からファイルを選んで、クイックアクションから、<br>
(<a href="#" class="imk-cue" data-seek="9:45" translate="no">00:09:45</a>) このマイギターコード起動および試聴のアプリをクリックします。<br>
(<a href="#" class="imk-cue" data-seek="9:52" translate="no">00:09:52</a>) 立ち上げ以降の操作は全く同じです。<br>
(<a href="#" class="imk-cue" data-seek="9:58" translate="no">00:09:58</a>) あとそれから、このMIDI出力用のボタンを押しますと、<br>
(<a href="#" class="imk-cue" data-seek="10:06" translate="no">00:10:06</a>) フォルダが開いてMIDIファイルがハイライトされますので、<br>
(<a href="#" class="imk-cue" data-seek="10:13" translate="no">00:10:13</a>) これをDAWのトラックにドラッグアンドドロップします。<br>
(<a href="#" class="imk-cue" data-seek="10:19" translate="no">00:10:19</a>) こういった形でフォルダが開きますので、<br>
(<a href="#" class="imk-cue" data-seek="10:23" translate="no">00:10:23</a>) このtemp_chord.midファイルをトラックにドラッグアンドドロップします。<br>
(<a href="#" class="imk-cue" data-seek="10:33" translate="no">00:10:33</a>) これはGarageBandへドロップしたMIDIノートです。<br>
(<a href="#" class="imk-cue" data-seek="10:38" translate="no">00:10:38</a>) それから次に、これはCubaseにドロップしたMIDIノートです。<br>
(<a href="#" class="imk-cue" data-seek="10:47" translate="no">00:10:47</a>) 以上で全体の説明は終わりですが、このアプリを使って、<br>
(<a href="#" class="imk-cue" data-seek="10:54" translate="no">00:10:54</a>) Cubaseに出力した音を再生してみます。<br>
(<a href="#" class="imk-cue" data-seek="11:40" translate="no">00:11:40</a>) まだまだ改善点は出てくると思いますけれども、ひとまずは完成にしておきます。<br>
</p> </details>
<style>
/* 汎用ベーススタイル（マイライブラリ等の単独表示・ブログ埋め込み用） */
details { font: 16px "Open Sans", Calibri, sans-serif; width: 100%; }
details > summary { padding: 2px 6px; width: 100%; background-color: #ddd; border: none; box-shadow: 3px 3px 4px black; cursor: pointer; list-style: none; }
details > p { font: 14px "Open Sans", Calibri, sans-serif; height:150px; overflow: scroll; background-color: #EDF7FF; padding: 2px 6px; margin: 0; box-shadow: 3px 3px 4px black; }

/* 動画パッケージ（mu1emd, dr5, dr6等）内での上書き専用スタイル */
.mu1emd-sublist details > p, .dr5-sublist details > p, .dr6-sublist details > p {
    display: block;
    min-height: 180px;
    max-height: 240px;
    overflow-y: auto;
    background-color: #EDF7FF;
    padding: 6px 8px;
    margin: 0;
    box-shadow: 3px 3px 4px black;
    border-radius: 0 0 5px 5px;
}
</style>
</div></div>            <script>
            document.addEventListener("DOMContentLoaded", function(){
                var video = document.getElementById("myVideo");
                if(!video) return;

                            });
            </script>
            

  <script>
  (function(){
    var me = document.currentScript;
    var wrapper = me ? me.closest('.sc-dynamic-embed') : null;

    function protectVideo() {
      var target = wrapper ? wrapper : document;
      var mediaEls = target.querySelectorAll('video, audio');
      mediaEls.forEach(function(v){
        if(v.dataset.protected === 'true') return;
        v.dataset.protected = 'true';
        v.setAttribute('controlsList', 'nodownload');
        v.oncontextmenu = function() { return false; };
        v.addEventListener('contextmenu', function(e){ e.preventDefault(); return false; }, false);
      });
    }

    function initSubtitles() {
      var target = wrapper ? wrapper : document;
      var video = target.querySelector('video, audio');
      var listContainer = target.querySelector('details > p');
      
      if (!video) return false; 
      
      if (video.dataset.subInit === 'true') return true; 
      video.dataset.subInit = 'true';

      var oldOverlay = target.querySelector('#subtitleOverlay') || target.querySelector('#scSubtitleOverlay');
      if (oldOverlay) {
          oldOverlay.style.setProperty('display', 'none', 'important');
          oldOverlay.innerHTML = ''; 
      }

      // 全画面・PiP・iOS全画面の判定（dr52.php準拠＋Safari presentationMode完全対応）
      function isSpecialMode() {
        var fsEl = document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement;
        var isFs = !!fsEl;
        var isWebkitFs = (video.webkitPresentationMode === "fullscreen") || !!video.webkitDisplayingFullscreen;
        var isPiP = !!(document.pictureInPictureElement && document.pictureInPictureElement === video) || (video.webkitPresentationMode === "picture-in-picture");
        return isFs || isWebkitFs || isPiP;
      }

      // 字幕トラックの表示/非表示を更新
      function updateTrackMode() {
        var hasList = (listContainer !== null);
        var desiredMode = (isSpecialMode() || !hasList) ? "showing" : "hidden";
        try {
          if (video.textTracks && video.textTracks.length > 0) {
            for (var i = 0; i < video.textTracks.length; i++) {
              var track = video.textTracks[i];
              if ((track.kind === 'subtitles' || track.kind === 'captions') && track.mode !== desiredMode) {
                track.mode = desiredMode;
              }
            }
          }
        } catch(e) {}
      }

      // 初回の反映
      updateTrackMode();

      // 各種全画面・PiP切り替えイベントの即時検知リスナーを登録（video本体・document双方を監視）
      ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange'].forEach(function(evtName) {
        document.addEventListener(evtName, updateTrackMode, false);
        video.addEventListener(evtName, updateTrackMode, false);
      });
      video.addEventListener('webkitbeginfullscreen', updateTrackMode, false);
      video.addEventListener('webkitendfullscreen', updateTrackMode, false);
      video.addEventListener('webkitpresentationmodechanged', updateTrackMode, false);
      video.addEventListener('enterpictureinpicture', updateTrackMode, false);
      video.addEventListener('leavepictureinpicture', updateTrackMode, false);
      video.addEventListener('play', updateTrackMode, false);
      video.addEventListener('pause', updateTrackMode, false);

      // 字幕一覧が存在する場合のみ、リストのフォーマット処理を行う
      if (listContainer) {
          var detailsEl = target.querySelector("details");
          if (detailsEl) {
              detailsEl.open = true; 
              var summaryEl = detailsEl.querySelector("summary");
              if (summaryEl) summaryEl.textContent = "字幕(シーン)はここをクリック";
          }

          if (!listContainer.dataset.formatted) {
              var html = listContainer.innerHTML;
              var lines = html.split(/<br\s*\/?>/i);
              var newHtml = "";
              for(var j=0; j<lines.length; j++) {
                  if(lines[j].trim() === "") continue;
                  newHtml += "<span class='imk-line'>" + lines[j] + "</span><br>";
              }
              listContainer.innerHTML = newHtml;
              listContainer.dataset.formatted = "true";
          }

          var rootSublist = target.querySelector(".dr5-sublist") || listContainer.parentElement;
          if (rootSublist) {
            rootSublist.addEventListener("click", function(e){
              var a = e.target.closest && e.target.closest("a.imk-cue[data-seek]");
              if(!a) return;
              e.preventDefault();
              var ts = a.getAttribute("data-seek");
              if(!ts) return;
              var p = ts.trim().split(":").map(function(x){return parseInt(x,10)||0;});
              var sec = (p.length===2) ? p[0]*60+p[1] : (p.length===3 ? p[0]*3600+p[1]*60+p[2]: null);
              if(sec==null) return;
              try{ video.currentTime = sec; if(video.paused) video.play(); }catch(_){}
            });
          }
      }

      // 再生中（時間進行時）の追従とハイライト更新
      video.addEventListener("timeupdate", function(){
        updateTrackMode();

        var hasList = (listContainer !== null);
        if (!hasList) return;

        var cues = listContainer.querySelectorAll("a.imk-cue");
        if(cues.length === 0) return;
        var cur = video.currentTime;
        var activeA = null;

        for(var i=0; i<cues.length; i++){
            var ts = cues[i].getAttribute("data-seek");
            if(!ts) continue;
            var p = ts.trim().split(":").map(function(x){return parseInt(x,10)||0;});
            var t = (p.length===2) ? p[0]*60+p[1] : (p.length===3 ? p[0]*3600+p[1]*60+p[2] : null);
            if(t !== null && cur >= t - 0.5){ activeA = cues[i]; } 
            else if(t > cur){ break; }
        }

        if(activeA){
            var activeLine = activeA.closest(".imk-line");
            if(!activeLine) activeLine = activeA;

            if(activeLine.classList.contains("active-hl")) return;

            var allLines = listContainer.querySelectorAll(".imk-line");
            for(var k=0; k<allLines.length; k++) {
                allLines[k].classList.remove("active-hl");
                allLines[k].removeAttribute("style"); 
            }
            var allLinks = listContainer.querySelectorAll("a");
            for(var m=0; m<allLinks.length; m++) {
                allLinks[m].classList.remove("active-hl");
                allLinks[m].removeAttribute("style"); 
            }

            activeLine.classList.add("active-hl");
            activeLine.style.setProperty("background-color", "#ffff00", "important");
            activeLine.style.setProperty("color", "red", "important");
            activeLine.style.setProperty("font-weight", "normal", "important");
            
            var newLinks = activeLine.querySelectorAll("a");
            for(var n=0; n<newLinks.length; n++) {
                newLinks[n].style.setProperty("color", "red", "important");
                newLinks[n].style.setProperty("text-decoration", "none", "important");
            }

            if(listContainer.offsetParent !== null){
                var containerRect = listContainer.getBoundingClientRect();
                var activeRect = activeLine.getBoundingClientRect();
                var targetScroll = listContainer.scrollTop + (activeRect.top - containerRect.top) - (listContainer.clientHeight / 2) + (activeLine.clientHeight / 2);
                listContainer.scrollTo({ top: targetScroll, behavior: "smooth" });
            }
        }
      });

      return true;
    }

    var checks = 0;
    var checkTimer = setInterval(function(){
      protectVideo();
      var success = initSubtitles();
      checks++;
      if (success || checks > 20) { 
        clearInterval(checkTimer);
      }
    }, 500); 

    if (!window.scStopAndGo) {
      window.scStopAndGo = function(event, link){
        try{
          var mediaEls = document.querySelectorAll('video, audio');
          mediaEls.forEach(function(m){
            try{
              if (!m.paused) m.pause();
              if (document.pictureInPictureElement === m && document.exitPictureInPicture) {
                document.exitPictureInPicture().catch(function(){});
              }
            }catch(e){}
          });
        }finally{
          event.preventDefault();
          setTimeout(function(){
            if (link.target === '_blank') {
              window.open(link.href, '_blank');
            } else {
              window.location.href = link.href;
            }
          }, 50);
        }
        return false;
      };
    }
  })();
  </script>
</div>



<div class="wp-block-cocoon-blocks-toggle-box-1 toggle-wrap toggle-box block-box not-nested-style cocoon-block-toggle"><input id="toggle-checkbox-202609260745410" class="toggle-checkbox" type="checkbox"/><label class="toggle-button" for="toggle-checkbox-202609260745410"><strong><span class="marker">実装方法(クリック)</span></strong></label><div class="toggle-content">
<figure class="wp-block-flexible-table-block-table"><table class="has-fixed-layout"><tbody><tr><td>要約：「マイギターコード」は、ギターコードの管理と自動化を行うPython製Macアプリです。ローカル上のExcel DBと連携し、画像選択時に指位置データやコードネームを自動表示します。Playwrightをヘッドレスで利用し、バックグラウンドでWebからコード情報を取得・自動同期。MacのGUIバグ回避のため<code>tk.Entry</code>を採用しています。ローカルMIDI機能が充実しており、<code>mido</code>仮想ポート経由でGarageBand/Cubase等のDAWへ和音や単音を発音。アルペジオ再生とMIDIファイル生成、Finderでのハイライト表示も可能です。オートセーブ、Excel行と画像ファイルの物理削除に対応。画像パスを引数に受け取り、自動モード切替・DB読込・MIDI発音を可能にする外部連携エンジンを搭載。Stream DeckやAutomatorのクイックアクションからの起動に対応し、クイックアクションでは既存アプリを終了しGarageBand/Cubase起動後に指定画像でアプリが立ち上がります。</td></tr><tr><td>実装方法：<br>(1)下のボタンからtxtファイルをダウンロードしてお使いの生成AI(Gemini ChatGPT Claudeなど)のチャットにペーストしてください。<br>(2)以下の指示文をチャットにペーストしてください。<br>「添付したスクリプトは、特定の環境向けに作られた[ ギターコードの管理と自動化を行う ]プログラムです。<br>これを私のパソコン環境（例：Windows 11 / OneDriveを使用）に移植して、今日から全く同じ動作を実行できるようにしたいと思います。<br>①私の環境に適合するように、プログラム（例：PowerShellやPythonなど最適な言語）を、必要に応じて、新しく書き換えて全文出力してください。<br>②プログラミング初心者でも迷わずに、今日から私のPCでこのプログラムを起動・実装するための「具体的な手順書」をわかりやすくテキストで教えてください。以上」</td></tr><tr><td><a href="https://imakat.com/script_list/?pubtxt=ギターコードアプリ改良版_pub.txt" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=zrU95MiY.png" alt="" style="width:120px; height:auto;"></a></td></tr><tr><td>内容に関するお問い合わせは以下へ↓</td></tr><tr><td><a rel="noopener" target="_blank" href="https://notebooklm.google.com/notebook/aa64cc3d-0160-4433-b934-ecc5ab902287"><img decoding="async" src="https://imakat.com/rd.php?id=vZJJ3Jfw.png" alt="" style="width:200px; height:auto;"></a></td></tr></tbody></table></figure>
</div></div>



<h2 class="wp-block-heading"><strong>介助アプリに求めた「3つの必須機能」</strong>&nbsp;</h2>



<p class="wp-block-paragraph">このアプリの目的は非常にシンプルです。以下の3つのステップで、音楽制作をサポートします。</p>



<p class="wp-block-paragraph"><strong>ステップ１：指板を押しながら和音を作る（本物のギター感覚）</strong>&nbsp;</p>



<p class="wp-block-paragraph">アプリ上の指板をクリックすると、まるで本物のギターの弦を押さえたようにその「単音」が即座に鳴ります。「Shiftキーを押しながらクリック」すると、全体の「和音」がジャラーンと鳴ります。画面が固まることもなくサクサクと音を探れるため、直感的にコードの響きを作っていくことができます。</p>



<p class="wp-block-paragraph"><strong>ステップ２：コードネームを調べる（自動取得＆AI解析）</strong>&nbsp;</p>



<p class="wp-block-paragraph">指の位置が決まったら、「指位置確認」ボタンを押します。すると、裏側で外部サイトと通信し、適合するコードネームを自動で取得してくれます。 しかし、ベース音を追加した分数コードなど、既存のサイトでは「コードネームなし」と判定されてしまうこともあります。そんな時は、アプリ上の指板画像をコピーして生成AI（Gem）に解析を依頼します。「最も一般的な解釈としては E13sus4、または分数コードの Bm11/E です」といった回答が得られるので、それを自分専用のコードネームとして登録しておきます。</p>



<p class="wp-block-paragraph"><strong>ステップ３：DAWへMIDI出力する（ドラッグ＆ドロップ連携）</strong>&nbsp;</p>



<p class="wp-block-paragraph">作った和音をCubaseやGarageBandなどのDAWで使いたい時、「MIDI出力」ボタンを押すと、自動生成されたMIDIファイル（.mid）がMacのFinderでハイライト表示されて手前にポップアップします。あとはそれをDAWのトラックへ直接ドラッグ＆ドロップするだけ。クリップボードの制約を受けない、確実でストレスフリーな連携です。</p>



<figure class="wp-block-image size-large"><a href="https://imakat.com/rd.php?id=4PNyQFHQ.png" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=4PNyQFHQ.png" alt=""/></a></figure>



<h2 class="wp-block-heading"><strong>使い勝手を向上させる裏側のインフラ設計</strong>&nbsp;</h2>



<p class="wp-block-paragraph">さらに、過去に作ったコードを効率よく再利用するための「インフラ設計」にもこだわりました。</p>



<ul class="wp-block-list">
<li><strong>右クリック一発で画像ロード＆全自動発音</strong>&nbsp;</li>
</ul>



<p class="wp-block-paragraph">「前に作ったあの和音、どんな響きだったかな？」と思った時、わざわざアプリを立ち上げる必要はありません。Finderから直接動かします。<strong>Finderはサムネイルを見やすいように拡大できます</strong>。それで、Finderに並んだ指板画像（サムネイル）を右クリックし、自作のクイックアクションを選ぶだけ。裏側でDAWが立ち上がり、アプリが該当画像を読み込んでフワッと起動し、全自動でギターが「ジャラーン」と鳴る流麗な連携を実現しました。<br></p>



<ul class="wp-block-list">
<li><strong>ファイル名がそのまま音符に！データとMIDIの直結設計</strong><br>例えば guitar_fretboard_30-25-22-18-14-n.jpg というファイル名。この「30-25-22-18-14-n」という文字列は、1弦から6弦までの指板の絶対値を表しています。アプリはファイル名からこの文字列を抽出した瞬間、「絶対値＋35＝MIDIノートナンバー」というシンプルな計算式で、即座にMIDIデータへ変換します。これにより高速で音が鳴ります。<br></li>



<li><strong>意識させないデータベース自動同期</strong><br>変更を加えたり別の画像を選んだ瞬間に、画面と裏側のExcelデータベースが100%自動で同期します。いちいち「保存ボタン」を押す手間を省くオートセーブ機能を搭載しました。<br></li>
</ul>



<h2 class="wp-block-heading"><strong>開発の裏側：AIバケツリレー</strong></h2>



<p class="wp-block-paragraph">このアプリはPythonで600行を超える大規模なものですが、自分でプログラミングしたわけではありません。私が構築している「AIバケツリレー」が役に立ちました。 まずNotebookでシステム全体の作戦を練り、設計図を書かせます。そして、いざ大規模なコードを生成する際は、Google AI Studioという「絶対にコードを省略しない重装備のAI」へ指示書を渡して一括で出力させました。適材適所でAIを使い分けるこのエコシステムのおかげで、複雑なアプリも無事完成に漕ぎ着けました。</p>



<h2 class="wp-block-heading"><strong>おわりに</strong></h2>



<p class="wp-block-paragraph">歳を重ねるにつれ、既存の高機能すぎるツールに合わせるのが辛くなることがあります。しかし、AIをパートナーに据えることで、必要な機能だけを抽出した「自分専用の介助ロボット」を自作できるようになりました。 このアプリによって、再び楽しく音楽制作に向かうことができればいいのですが、さあどうかな。</p>



<p class="wp-block-paragraph">以上</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">29494</post-id>	</item>
	</channel>
</rss>
