FIELD NOTES: 書を持って街へ出よう

合同会社フィールドワークス プログラマ兼代表のブログ

テレビ台型 開管共鳴管式 マトリックススピーカーの製作

自宅の居間のテレビの音質を向上させるため,テレビ台型スピーカーを自作しました。

設計

最初に候補に考えていたのはTVラック一体型のマトリックススピーカー1「王座F2」でしたが, ブラウン管TV時代の設計のため,そのままでは最近の横長TVにはマッチしません。

そこで王座Fのコンセプトだけを頂いて,オリジナルなスピーカーとして再設計することにしました。

横幅の変更

最初は単純に「王座F」の横幅700mmを900mmに拡張することを検討しました。
しかし,横に長くしただけでは,

  • 第1キャビネットの容量が増えすぎる。
  • ラック部分の横幅が不自然に広くなる。

といった問題がすぐに見えてきました。

そこで,第2キャビネットを両サイドに配置するのはやめて, 横に長くなった天板下の空間にすべてを収めることにしました。 サイドの第2キャビネットをなくしたことで空間が広がるので, 縦2列のラックとして利用できそうです。

キャビネット構造の変更

「王座F」はダブルバスレフ方式ですが,これを平べったい空間に実装するのは無理がありそうです。 テレビ台の奥行きは,400mm〜450mm程度になると思いますが, 第1キャビネットと第2キャビネットの容積比を1:3ぐらいと仮定すると, 第1キャビネットが100mm程度の角柱状になってしまうからです。

  • 第1キャビネットが共鳴管として働いて変な癖が出てしまうのではないか?
  • それならいっそのこと,共鳴管型スピーカーにしてしまってはどうか?

という流れで,共鳴管型スピーカーとしてキャビネット構造を見直すことにしました。

開管共鳴管型

スピーカーのエンクロージャーの形式には,密閉型,バスレフ型,ダブルバスレフ型,バックロードホーンなど色々ありますが,共鳴管の原理を利用して低音を増強する共鳴管型というものもあります。

共鳴管には開管と閉管がありますが, マトリックススピーカーの3つのユニットを無理なく配置するには開管にするしかなさそうです。 開管共鳴管の成功事例をあまり見かけたことがないので不安でしたが,開管共鳴管型に挑戦してみることにしました。

最終的な設計

設計図は下記のとおりとなりました。

f:id:fet:20180901225007p:plain
設計図

共鳴管型スピーカーの設計にあたっては,AudiFill公式ブログの記事を参考にさせていただきました。

  • 一本の開管共鳴管の中央付近にマトリックススピーカーの3つのユニットをマウントする開管共鳴管型とした。
  • 管の長さLは2.5m程度になるので,設計上の共振周波数f0は,340/(2×L)≒68Hz。
  • 開口からの中高域の漏れ対策よりよも共鳴管として効率的に動作させることを優先させた。
    →計4回折れ曲がる構造で,そもそも共鳴管としての動作するかどうかが心配されたため。
    • 共鳴管の断面は正方形に近い形状にした。
    • 共鳴管の断面積を一定とした。
      →設計図で開口側だけ微妙に広くなっているのは単なる計算ミス。本来ならば,126mmできっちり3等分できたはず。
  • 共鳴管の断面積は12㎝×12.4㎝≒149㎡とした。
    • ユニット3本分の振動板面積に対して1.8倍
    • 同時に働くのが実質2本相当({L-R}+{R+L}+{R-L}=R+Lだから?)とみなせば2.7倍
  • ユニットは,手持ちの関係でFF85WKを想定。

製作

製作には,18mm厚の三六判パイン集成材を2枚使用しました。 塗装は,水性ウレタンニスで仕上げました。

f:id:fet:20180901225020j:plain
外観

マトリックス結線

通常のマトリックス結線はバランス出力やBTL出力のアンプに利用できないのですが,今回は湘南電波研究所(SRL)で紹介されているBTL出力アンプで使えるマトリックス結線を利用させていただきました。

測定

下表に軸上1mでの周波数特性とインピーダンス特性を示します。

f:id:fet:20180901225025p:plain
周波数特性+インピーダンス特性

周波数特性はピークとディップが多いですが,低域までよく伸びています。

インピーダンス特性を見ると,70Hz, 130Hz, 202Hz, 258Hz, 337Hzあたりに谷が見られます。 基音と2,3,4,5倍音の周波数での共振が観察され,開管共鳴管として動作しているようです。

共鳴管の中央にユニットを配置したことで偶数倍の共振が潰されることを心配していましたが,大丈夫だったようです。

試聴

居間にセッティングして,テレビのヘッドフォン端子→デジタルアンプ(FX-501J×2)→本スピーカーという接続で試聴しました。

吸音材なしの状態では癖が強く,長時間テレビを鑑賞するのは厳しい音でした。 やはり対策なしでは開口部からの中広域の漏れが強いようです。

そこでユニットの裏側と開口部奥に吸音材(水槽用ろ過マット)を詰め込んだところ,落ち着いて聴いていられる音になりました。

ノーマルのままでは低音域は伸びているのですが,AV用としては少し物足りない感じでした。 テレビの設定で低音を少しブーストしたら良い感じのバランスになりました。


  1. 特殊な結線により1台でサラウンド感を出すことのできるスピーカーです。一つのエンクロージャーに3つのスピーカーユニットを配置して,中央のユニットにはR+Lを,左側にはL-R,右側にはR-Lの音声出力を担当させます。

  2. 長岡鉄男氏設計のスピーカーエンクロージャーです。長岡鉄男最新スピーカークラフト〈3〉に製作記事が掲載されています。TVラック一体型であること,マトリックススピーカーであることが特徴です。

Asterisk 13で作るクラウドFAXシステム

はじめに

弊社では,会社電話/FAXをオープンソースIP-PBXソフトウェアAsteriskで運用しています。

Asterisk 13からはFAXを送受信するための機能が標準搭載されているのですが, FAXイメージをTIFFファイルレベルでやり取りする機能までしか提供されておらず, そのままでは実務には使えません。

そこで,AsteriskのFAX機能を補強するためのPythonスクリプト集(faxmail)を作成し使用しています。

Asteriskとfaxmailを利用すれば,基本的にクラウドサーバの利用料+通話料だけでクラウド電話/クラウドFAXサーバシステムが維持できます。

IDCF Cloudのクラウドサーバーの料金が月額約400円(S1サーバー+ボリューム10GB)。 また,基本料金が無料のIP電話サービスを利用していますので, 月額合計500円程度で運用できています(電話の発信は非常に少ないので)。

f:id:fet:20170518101736p:plain

何ができるのか?

Eメールを介してFAXの送受信ができます。
スマートフォンを持っていれば,どこにいてもFAXを受けられますし,FAXを送信することもできます。

FAXの受信

FAXの外線番号に着信すると自動応答して,受信したFAXイメージを画像ファイル化します。 受信完了後,PDFを添付したメールを決められたアドレスへ送信します。

ファイル添付メールの送信には,faxmailに付属するメール送信コマンド(sendmail.py)が利用できます。

FAXの送信

添付画像(PDF, TIFF, JPEG, PNG)やメール本文(HTMLまたはプレーンテキスト)をイメージ化して,FAXで送信します。

送信結果やFAXイメージをメール送信者に送り返すように設定することもできます。

基本的な使い方

PDFファイルを添付したメールを以下のような形式のアドレスに対して送信します。 本文テキストは無視されますので,フッター等が残っていても大丈夫です。

fax+<送信先電話番号>@<自ドメイン>

メールの件名はただのメモの扱いですが,必要であれば末尾にFAX送信コマンド(sendfax.py)に与えるオプションを追加指定し,送信画質や本文テキストの扱いなどを変更することができます。

<件名> { <追加オプション> }

本文テキストの送信

デフォルトでは本文テキストは単に無視されますが,本文をFAXイメージ化して送信する事もできます。
件名の末尾にテキスト形式指定のオプション(--textまたは-t)を指定します。

<件名> { --text <テキスト形式> }

テキスト形式として指定できるのは,以下の3種類です。

htmlを使用する場合は,本文をHTML(リッチテキスト)形式で記述します。

plainまたはmarkdownを使用する場合は,本文を標準テキスト(プレーンテキスト)形式とします。 plainでは,本文を見たままのテキストとしてイメージ化します。 markdownでは,テキストをmarkdownとして解釈し内部的にHTML貸した上でイメージ化します。

Markdown+PDFのメール

sendfax.pyコマンドにメールメッセージが渡されると,メッセージから添付画像を抽出してFAXで送信可能なTIFF G3形式に変換し,Asteriskに対してFAXの送信の指示を行います。

送信イメージ

Dry Runモード

Dry Runモードを指定すると,FAXの送信は行わず,FAXイメージの生成のみ行います。

<件名> { --dry-run }

メールクライアントにより,MIMEマルチパートメッセージの組み立て方に癖があるようです。 広範なテストは行っていませんので,生成されるFAXイメージを確認してから実際に送信を行ってください。

何が必要か?

クラウドサーバー

以前は弊社でも社内サーバでAsteriskを運用していたのですが,現在ではクラウドサーバーに移行しました。 主にネットワーク回線の品質向上を狙ったもので,回線品質が十分ならばオンプレミス構成でも問題ないと思います (弊社が契約しているネットワーク回線は速度にムラがあるようで,時々音質が低下したり,一瞬音声が途切れたりしていました)。

弊社では,IDCF Cloudを S1サーバー+ボリューム10GBの構成で運用しています。

IDCF Cloudのようにグローバルアドレスが割り当てられないタイプの仮想マシンでは,AsteriskをNAT背後に設置することになりますので,NAT対策が必要になります。 下記サイト等を参考にしてください。

IP電話サービス

Asteriskに収容可能なIP電話サービスはいくつかありますが,どれもFAXでの利用を公式にサポートしているわけでありません。 事前にテストを行ってください。

弊社で確認した中では brastel の結果が良かったのでこれを採用しています。

ドメイン

メール受信のために必要になります。

SIPクライアント

IP電話

事務所に固定電話機を設置する場合は,IP電話機が必要になります。

以下のサイトに,Asteriskで接続実績のあるIP電話機のリストが掲載されています。

新規に購入するのであれば,Grandstreamかパナソニックあたりが入手しやすいのではないかと思います。

中古で良ければ,オフィスで不要になったIP電話機がヤフオク等に格安で出品されていることがあります。

SIPクライアントソフトウェア

スマートフォンやPCをIP電話機として利用することができます。

弊社では,Acrobits Softphoneを使用しています。

どうすれば使えるのか?

具体的な手順を書いてもすぐに風化してしまうので,ポイントだけ示します。

Asteriskの設定

本稿では,Asterisk 13の利用を前提としています。 Ubuntu(debian系?)であれば,aptコマンドでインストールできます。 ただし,aptコマンドでは日本語音声ファイルをインストールできないようなので,必要であれば(Asteriskのソースなどから)別途入手してください。

Asteriskの基本的な設定方法については検索すれば色々出てくると思いますので,そちらを参考にしてください。

たたし,Asteriskのバージョンによって設定ファイルの記述方法が少しづつ違ってきますので,Asterisk 13用の設定であることをよく確認してから参照してください。 特に「asterisk FAX」で検索すると,iaxmodem + hylafax の構成例が大量にヒットすると思いますが,今回の方法では適用できません。

ここまでの設定で,以下のことができるものとします。

  • 内線電話間の通話
  • 外線着信,外線発信

メールサーバーの設定

Postfixをインストールするものとします。

Eメールの送信・受信ができる状態にしてください。

faxmailの設定

githubからソースを取得して,適当な場所に配置してください。

$ git clone https://github.com/kkajita/faxmail.git

スクリプトの実行に必要な,追加ライブラリ・外部コマンドのインストール方法やAsteriskの追加設定については,添付のREADMEを参照してください。

Evernoteで図入りのMarkdown文書を書いてMarkedでプレビューする方法(Mac OS X)

EvernoteにMarkdown記法でメモを書くのは便利なのですが, せっかくEvernoteを使っているのに図を手軽に扱えないのは残念なので,ひと工夫してみました。

f:id:fet:20131221194358p:plain

使い方

以下が作成したPythonスクリプトです。

<EVERNOTE_USER_NAME>の部分は,Evernoteのアカウント名に置き換えてください。

EvernoteにMarkdown形式で記述した文書をMardedでプレビューするためのMac OS ...

これをAutomatorでサービスとして登録します。

f:id:fet:20131221194051p:plain

Evernoteでページを編集中に登録したサービスを呼び出せば, Marked.appで表示されます。

f:id:fet:20131221194117p:plain

仕組み

Mac版のEvernoteでは,Evernoteのデータを以下のディレクトリ配下に格納します。

 「~/Library/Containers/com.evernote.Evernote/Data/Library/Application Support/Evernote/accounts/Evernote/<ユーザ名>/content」

編集中のページに対応するディレクトリがどれかは, Apple event経由でEvernoteに問い合わせてもわからない様なので, 更新日時が最新のディレクトリを編集中のページに対応するディレクトリと見なします。

ページの内容はcontent.htmlというファイルに反映されます。 ページに挿入した画像は,同じディレクトリ内に画像ファイルとして保存されます (⌘+Sキーを押せば,編集内容は即座にファイルに保存されるようです)。

html2textを使って,content.htmlをMarkdown形式に変換し, 同じディレクトリにファイルとして保存します。 この部分の処理がhtml2textの本来の使い方から外れていてトリッキーですが, Markdown表記のテキストはP要素の内容としてそのまま出力されます。 画像は,context.htmlの中ではIMG要素として表現されるので, 結果的に「![](<画像ファイル名>)」形式に変換されます。

次に作成したMarkdownファイルをMarked.appで開くのですが, 画像ファイルと同じディレクトリにあるので画像も表示されます。

参考にさせていただいた記事

PDF帳票を作成するためのWEB APIを提供開始しました

クラウド上のシステムからPDF帳票を作成するための実験的なサービス Field Reports for Cloud を提供開始しました。

このサービスで提供するField Reports APIを利用すれば,Google App Engine (GAE), Heroku, Salesforce.com (SFDC) などのPaaS上に構築されたシステムから,PDF帳票を作成することが可能になります。

Field Reports APIを利用するには,Field Reports for Cloud のサイト で利用者登録を行い,APIキーを取得する必要があります。

PDF帳票を作成する際には,JSON形式で記述したAPIパラメータ(レンダリング・パラメータ)を所定のURLにPOSTします。 リクエストの応答として,サーバ側で生成したPDFが返されます。

おおよそ以下2点の要件を満たす動作環境であれば,利用できるはずです。

  • 任意のJSON文字列を組み立てることができること。
  • 作成したJSON文字列を所定のURLへPOST(アップロード)できること。

このサービスは実験的な提供のため,現時点での利用料は無料です。

後述するようにトランザクション数などに制限を掛けてはいますが,Field Reports Standardの機能をほぼそのまま利用することができます。 トランザクション数がそれほど多くないシステムからであれば,かなり実用的に使うことができるのではないかと思います。

システム構成

実行環境としては,さくらVPSの2Gを利用しています。

使用している主なソフトウェアの構成は,以下のとおりです。

項目 ソフトウェア名
Webサーバ nginx
アプリケーションサーバ web2py
帳票ライブラリ Field Reports Standard for Linux


利用制限について

このサービスは,API呼び出し時のパラメータによりサーバに掛かる負荷が大きく変わります。 そこで,以下のような利用制限を設定しています。

  • 1日当たり(24時間以内)の呼び出し回数は,30件まで
  • 作成する帳票のページ数は,10ページまで

現在のところ,さくらVPS 2Gでまかなえる範囲内でこのサービスを運用していきたいと考えています。 サーバの負荷状況によっては,新規の利用者登録を停止したり上記の制限を変更する可能性があることを, あらかじめご了承願いたいと思います。

Hello World

コマンドラインツールのcurlを使って,APIを呼び出してみます。

まず,JSON形式のパラメータを作成してファイルに保存します(ファイル名:hello.json)。 <APIキー>の部分には,取得したAPIキーを記入します。

{
    "settings": {
        "api-key": <APIキー>
    },
    "template": {"paper": "A4"},
    "context": {
        "hello_1": {
            "new": "Tx",
            "value": "Hello, World!",
            "rect": [100, 700, 400, 750],
            "font": "/Times-Roman"
        },
        "hello_2": {
            "new": "Tx",
            "value": "Hello, World!",
            "rect": [100, 600, 400, 650],
            "font": "/Helvetica-Oblique"
        },
        "hello_3": {
            "new": "Tx",
            "value": "Hello, World!",
            "rect": [100, 500, 400, 550],
            "font": "/Courier-Bold"
        },
        "hello_4": {
            "new": "Tx",
            "value": "ABCDEFGHIJKLMN",
            "rect": [100, 400, 400, 450],
            "font": "/ZapfDingbats"
        },
        "hello_5": {
            "new": "Tx",
            "value": "こんにちは世界",
            "rect": [100, 300, 400, 350],
            "font": "/KozGo-Medium"
        }
    }
}

hello.jsonがカレンドディレクトリに存在する状態で,以下のようにcurlコマンドを実行します。

$ curl -k https://labs.field-works.co.jp/webapi/render --data @hello.json -o hello.pdf

成功すれば,以下のようなPDFが作成されます。

テンプレートを利用した帳票作成

本格的な帳票の作成には,テンプレートの利用が必須になります。

Field Reports ではテンプレートをPDF形式で作成しますが, 作成したテンプレートファイルを何らかの方法でサーバに送り込む必要があります。

それには,以下の3種類の方法が考えられます。

  1. Field Reports for Cloud サーバ上に置き,ローカルパスを指定する。
  2. 利用者側が準備したサーバ上に置き,URLを指定する。
  3. data URI scheme文字列として,レンダリングパラメータにインラインで埋め込む。

現在のところ,利用者が任意のファイルをField Reports for Cloud サーバ上に置くことを許可していませんので, 1の方法で利用できるのは,前もって準備してある数種類のサンプルのみです。

2の方法を取る場合は,以下のようにテンプレートの場所を指示します。

"template": {"src": "http://example.com/template.pdf"}

3の方法を取る場合は,テンプレートファイルをBase64エンコードした上で,レンダリングパラメータに埋め込みます。

"template": {"src": "data:application/pdf;base64,AAAoAAAARgAAAMD....."}

同様に,画像ファイルやフォントファイルなどもURLかdata URI scheme文字列で指定することができます。