翻訳/Translate

2026年9月29日火曜日

260929 アイワ AIWA製 2way スピーカー SX-LM77 メンテナンス(コンポ XR-MD110)後編 NFJスピーカーに交換 ツイーターはセラミック⁇

こんにちはHousukeです。


前回:『260924 アイワ AIWA製 2way スピーカー SX-LM77 メンテナンス...』の続きです。

🐏スピーカー交換🐏
≣ネオジウム磁石仕様で135g≣
NFJさんに注文していたスピーカーが届きました。
135gと軽量です。
ネオジウム磁石仕様のため 小さく出来ています。一見貧弱に見えますが、基本性能に問題はないと思います。Amazonにも出品されていますが、良い評価が多く平均 4.5★です。
ちなみに オリジナルスピーカーは480gです。スピーカー箱全体が軽くなりました。

≣ガスケット切り取り≣
スピーカーの取付け寸法は 文句なしに合っているのですが、惜しいかなガスケットが 出っ張って 2㎜くらい高くなっています。
スピーカーグリルのスピーカー穴部分がガスケットに密着するようになっているので それを組付けた時 2㎜浮いてしまいます。
ガスケットの出っ張った部分を、模型工作用の精密ノコで 横から切り取ることにしました。

ガスケットは紙なので楽勝と思いきや、バラけて切りにくいのと すぐ内側のエッジが睨みつけ付けるので 2個で 1時間以上掛かりました。😽


≣スピーカー取付け≣
スピーカーを外すときは 壊さないよう ゆっくり少しずつの 大仕事でしたが、取付けは つっかえることもなく簡単にできました。
         ⇩


🐏音出し確認🐏
<ウーファー単体>
マイクロフォン(スマホ)迄の距離は 1m
200Hz辺りに共振ぽい山がありますが、これは 前回ご紹介した 我が家の6畳間のクセだと思います。
そんなことより、ネットワーク回路のHCF(ハイカットフィルタ)を通しているのに、中高音が高くなっています。これだとツイーターの調整が難しくなります。ちょっと嫌な予感がします。


<ツイーター単体>
仮組した時に スイープジェネレーター音源を再生して 耳で確認したところ 3~4KHz辺りの音がやたら 大きくうるさく聞こえました。
ツイーターに 2.2μFをシリーズに入れて fc(クロスオーバー周波数)を高い方に追いやりました。ネットワーク回路には すでに 2.2μFが入っているので、直列計算して 1.1μFになり、fcは計算上 36KHz?になります。
マイクロフォン(スマホ)迄の距離は 1m

ツイーターの再生帯域は 5KHz以上になりました。
追記:どうやらツイーターはセラミックのようです。前回も fcが聞いたことがないくらい高いとか 言ってましたが、fcが計算上 超高い➯スピーカーインピーダンスが超高い➯セラミックツイーターとやっと頭の中で繋がりました。組上げて仕舞ったので、次に 分解した時に テスターで確認したいと思います。
ただ、セラミックツイーターだから ダメだということはないと思います。スーパーツイーターにはよく使われていますし、SONY製で 2wayに使われていた機種があったと記憶しています。今回 ツールを使って何回もテストをして 試聴もしましたが、全く気が付きませんでした😁。
とは言っても、セラミックに限らないのですが カッコだけの粗悪品スピーカーが多いので注意は必要です。いくつかまとめてみました。➯
🎲オマケ情報🎲


<ウーファー、ツイーターを合体して音出し確認>
定位置(鴨居の上)
マイクロフォン(スマホ)迄の距離は 2m
いつもの6畳間の長手両端、鴨居の上です。

定位置(鴨居の上)+SubWoofer
マイクロフォン(スマホ)迄の距離は 2m
2.1ch サブウーファーを追加した状態です。
300~1KHzに凹みが出来てしまいました。ウーファーとして使った NFJのスピーカーが予想外のハイ上がりだったのが原因です。😓
また、出力の大きな ツイーターのfcを高くして 無理やりバランスをとっているので、なんか気分的によろしくありません。
なので、ウーファーの高域と ツイーター全域を抑えるように ネットワーク回路を改造することを 考えています。
(鴨居の上に置いて測定した特性の方が、単体より 中高域が減衰して フラットになっています。鴨居の上だとマイク迄の距離が 2mですが、単体(作業台)だと 1mです。この距離と壁や天井の反射・吸収の違いが 減衰させている理由だと考えています。いつものことなので 多少予想は していましたが、顕著に出ました。)

次回 ネットワーク回路の改造を ご紹介したいと思います。

それでは次回お楽しみに...


🎲オマケ情報🎲
カッコだけの粗悪品スピーカー
安いので試しに買ってみましたが...
どーにもなりません。

もう一つ思い出しました。
F特はガタガタ。
ツイーターは偽装です。
😂
まだあります。
➯『231115 トリッキーな音 PC用スピーカー OROROW の周波数特性をスマホで調べてみました』


JBL control-1Xのスペクトラム画像
いつも基準・目標にしている JBL control-1Xです。今回、収音マイクを変えたので、それの確認のために同じ条件で撮りました。
総販売台数が数百万台の実績はダテではないようです。
特性曲線に なんだか貫禄すら感じます。

2026年9月24日木曜日

260924 アイワ AIWA製 2way スピーカー SX-LM77 メンテナンス(コンポ XR-MD110)前編

こんにちはHousukeです。

AIWA製のスピーカー SX-LM77のメンテナンス作業をご紹介します。

SX-LM77は 1999年にAIWAが発売した CD/MDコンポ XR-MD110に付属していた スピーカーです。

小型ながら、CD/MD、重低音EQ/サラウンドなど機能てんこ盛りのオーディオコンポです。また、グッドデザイン賞を受賞しているそうです。

🐏各部のチェック🐏
コーン紙に 放射状のひび割れがあるのは フリマ入札時に承知していましたが、製造後30年近く経っているものなので 他にも未だありそうです。
各部のチェックしていきたいと思います。

≣グリル外し≣
XR-MD110の当時のサービスマニュアルがネットに転載・公開されています。CD/MDメカの分解図や回路図・基板図などを参照できます。
その中に、スピーカーの分解の仕方の説明が載っていました。
XR-MD110 サービスマニュアル

グリルと本体のすき間に マイナスドライバーとタガネを挿し込んで ゴムハンマーで叩けとあります。

手持ちの ノミとドライバー・金槌を使って、すき間を少しずつ広げるようにして...

なんとか外しました。😁

グリル側の筒状の突起 4つを 本体側にはめ込み固定するようになっています。はめ込み部分には ゴム系の接着剤が塗られています。ネット動画に突起を折ってしまった事例があったので、ゆっくり少しずつが良いと思います。

≣ウーファーのチェック≣

コーン紙には ラミネートフィルム材が使われていて、そのフィルムが劣化して ひび割れています。

ひび割れはコーン紙の裏側にまで達しています。
修復するつもりでしたが、これは無理そうです。
サビもひどくて 触りたくない こともあるので、さっさと 替わりのスピーカーを探すことにしました。

≣ツイーターのチェック≣

こちらはしっかりしています。
セラミックなんかではなく 丁寧に作られたソフトドームツイーターです。
このツイーターだけで、スピーカー購入金額 2,300円の価値がありそうです。

≣箱の中の様子≣

箱の中を見てみました。吸音材はなく、ネットワーク回路とダクトが見えます。
コンデンサーの容量が確認できたので回路図にしてみました。


ツイーターのインピーダンスを 4Ωとして計算するとfc(クロスオーバー周波数)が 18KHzになりますが 聞いたことが無い高い数値設定です。次回 実装するときに計測するので 何か分かればご紹介したいと思います。😑


≣周波数スペクトラム≣
いつもの スマホを使った周波数スペクトラムを見てみました。
2~3
KHz辺りに大きなうねりがあります。多分 コーン紙の劣化が原因だと思います。次回は まっ平になる予定です。
(200Hz辺りの山は我が家の6畳間のクセも関係しているようです。天井板かなんかの共振だと思うのですが、モニタースピーカーでも気まぐれに発生します。😓)


🐏部品の手配🐏
交換用のウーファーは、NFJストア@ヤフー店さんに注文しました。フルレンジですが ネットワーク回路を通すので 問題はないと思います。

次回、ウーファーを交換して チューニング・音出しをしたいと思います。
次回:『260929 アイワ AIWA製 2way スピーカー SX-LM77 メンテナンス...』

それでは 次回お楽しみに...


🎲追加情報🎲

2026年9月8日火曜日

260908 GeminiでGmailを読込むプログラムを AI生成 Google Colab... その2API設定

こんにちはHousukeです。

前回:「260902 GeminiでGmailを読込むプログラムを AI生成...」の続きです。
今回は、生成したプログラムの動作チェックをしたいと思います。 

🐲プログラムの動作チェック🐲
▶を押して実行したところ、次のエラーを吐き出しました。
------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
/tmp/ipykernel_604/1505966352.py in <cell line: 0>()
       53 
       54     # Get the Gmail service
---> 55     service = get_gmail_service()
       56 
       57     # List the first 10 messages (you can adjust the number or query)
------------------------------------------------------------------------
1 frames
------------------------------------------------------------------------
/usr/local/lib/python3.13/dist-packages/google_auth_oauthlib/flow.py in from_client_secrets_file(cls, client_secrets_file, scopes, **kwargs)
      198             Flow: The constructed Flow instance.
      199         """
--> 200         with open(client_secrets_file, "r") as json_file:
      201             client_config = json.load(json_file)
      202 

FileNotFoundError: [Errno 2] No such file or directory: 'credentials.json'
------------------------------------------------------------------------

≣エラー内容≣
ファイルが見つからないというエラーなのですが、探そうとしているホルダー自体が無いようです。/python3.13/を探してみましたが どこにも在りません。また、'.json 'という拡張子は 通信でやり取りする API(Application Programming Interface)ファイルに使われることが多いそうです。
大雑把に エラーを 要約すると 'APIを使うための設定をしてなかった'ということになります。


🐲エラーの修正🐲
なるべく手作業はしたくないなぁ と思いながらググっていたら、Google Workspaceのガイドに良さそうなページがありました。
『Gmail API にリクエストを行う Python コマンドライン アプリケーションを作成します。』とあります。
次のようなPythonプログラムが続きます。
APIの認証をするプログラムらしい...
⇩
が、違う気もします。認証を確認する文は見当たらないし...😓
とりあえず Google Colabへコピペしました。
⇩
▶実行すると、
-------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
/tmp/ipykernel_3742/1406074078.py in <cell line: 0>()
       53 
       54 if __name__ == "__main__":
---> 55   main()
-------------------------------------------------------------
1 frames
-------------------------------------------------------------
/usr/local/lib/python3.13/dist-packages/google_auth_oauthlib/flow.py in from_client_secrets_file(cls, client_secrets_file, scopes, **kwargs)
      198             Flow: The constructed Flow instance.
      199         """
--> 200         with open(client_secrets_file, "r") as json_file:
      201             client_config = json.load(json_file)
      202 

FileNotFoundError: [Errno 2] No such file or directory: 'credentials.json'
...やっぱり エラーでした💀。
-- AI Geminiの説明 ------------------------------------------
このエラーは FileNotFoundError: [Errno 2] No such file or directory: 'credentials.json' です。コードが InstalledAppFlow.from_client_secrets_file 関数を使って credentials.json ファイルを開こうとしていますが、このファイルが見つからないために発生しています。Google API で認証を行うには、Google Cloud Console からこの credentials.json ファイルをダウンロードし、ノートブックと同じディレクトリに配置する必要があります。
-------------------------------------------------------------


API設定作業を追加した プログラムを Geminiに再度書かせる手もありますが、自分のPC内にホルダーを作る作業を無事にやってくれる気がしません。
なので API設定は、次回 手作業でやることにしました。

次回おたのしみに...

2026年9月2日水曜日

260902 GeminiでGmailを読込むプログラムを AI生成 Google Colab(インタープリタ言語 Python/パイソン)

こんにちはHousukeです。

ここ最近 NVIDIAの株価がどうしたとか、仕事を取られるとか PC界隈の話題が AI一色になってしまいました。

いつもの PCネタのブログを書く気になれません。この先どうなるか分からないし、メモリはやたら高いし...😓
そこで今回、流行りに乗って AIでプログラムを作るネタをやってみることにしました。
プログラム言語は、昔 BASICをやったことがあるので それに よく似たインタープリタ(スクリプト)言語 Python/パイソンにしました。
開発環境は、なるべく面倒なことをしたくないので Googleアカウントで使える Google Colab(Python)にしました。
なんだか Googleの術中に嵌っているようですが、AIも自動的に Geminiになります。


🐲AI GeminiでPythonプログラムを生成🐲
溜まってしまったGmailを整理するために、一旦 それを全部読取るプログラムを お題にしました。
≣プログラム生成をGeminiに指示≣
『Gmailを読み込むプログラム』と指示しました。


≣Geminiが生成した Pythonプログラム≣
指示から 10数秒後、次のように結果が出ました。

プログラム文を取り出してみました。
-------------------------------------------
import os
import pickle
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']

def get_gmail_service():
    creds = None
    # The file token.pickle stores the user's access and refresh tokens,
    # and is created automatically when the authorization flow completes for the first time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            # Download your credentials.json file from Google Cloud Console
            # and upload it to your Colab environment.
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('gmail', 'v1', credentials=creds)
    return service

def list_messages(service, user_id='me'):
    try:
        response = service.users().messages().list(userId=user_id).execute()
        messages = []
        if 'messages' in response:
            messages.extend(response['messages'])

        while 'nextPageToken' in response:
            page_token = response['nextPageToken']
            response = service.users().messages().list(userId=user_id, pageToken=page_token).execute()
            messages.extend(response['messages'])
        return messages
    except Exception as e:
        print(f'An error occurred: {e}')
        return []

if __name__ == '__main__':
    # First, install the required libraries if you haven't already:
    # !pip install google-api-python-client google-auth-oauthlib

    # Get the Gmail service
    service = get_gmail_service()

    # List the first 10 messages (you can adjust the number or query)
    print('Listing messages...')
    messages = list_messages(service)

    if messages:
        print(f'Found {len(messages)} messages. Displaying first 10 IDs:')
        for i, message in enumerate(messages[:10]):
            print(f"Message ID: {message['id']}")

            # To get full message details, you would need to fetch each message:
            # msg = service.users().messages().get(userId='me', id=message['id']).execute()
            # print(f"Subject: {msg['payload']['headers'][...]['value']}") # This requires parsing headers

    else:
        print('No messages found.')
-------------------------------------------

入れ子がキチっとしていて、コメントもちゃんと入ってます。昔 目を三角😈にしてキーボードを打っていたことを思い出して 隔世の感を通り越して 思わず脱力しました。
生成したプログラムは よく見ると なんか足らないような気がしますが、次回 実行して問題があれば 修正した内容を お伝えしたいと思います。
次回⇒『260908 GeminiでGmailを読込むプログラムを AI生成 Google Colab... その2API設定』

それでは次回 お楽しみに...