頂いたご意見から、色々な断片があることが分かった。殆どは知っているものだったので、驚くには当たらないが、買い物リストを作るのではなく、ソリューションを構築したい。そのソリューションは、各種のソフトウエア断片が含まれ、全てがまとまってサポートの役目を果たさなければならない。分かっている断片は以下である:
基本的なカスタマになりそうな相手先を、次の三つの方法で考えることが出来る:
マーケットは巨大で多様だ。多様である結果、このプロジェクトに取り込みたい選択対象が沢山ある。例えば、贔屓の政治又は宗教を助ける武器にしたいのであれば、効率の良いラジオ音声に落ち着くだろう。金儲けだけが目的なら、助力を求め報酬を支払うラジオ局は掃いて捨てる程ある。.
FM放送局だけを見ても、そのバンド内に100個の利用可能周波数がある。米国では、これらの周波数を、同一及び隣接周波数の他局の信号強度に基づいて割り当てている。正確な数は知らないが、米国だけで数千局あって良いことになる。AM放送と短波局に目を転じても製品の潜在顧客がある。それで不十分なら、インターネット専用局も同一システムを使用することが出来る。
読み進んで頂くと、良く分かる筈だ。プロジェクト全体計画を述べてから、それに基づく特定問題を取り上げる。
在来ラジオ局の働きを述べよう。在来とは、多年稼働して来た局のことだ。何処が自動化されるかが分かると、物事が理解し易くなる。
一般的な局には、一つ以上のスタジオと送信施設がある。スタジオは音響装置のある防音室以外の何物でもない。送信器は、同一建物内にあるか又は専用線又はラジオリンクで結ばれた遠隔地にある。送信リンクについても議論の余地があるが、ここでは、スタジオの話を限る。
一般的に、1スタジオだけを生放送にする。そのスタジオ内の出来事は、何でも直接送信器に送られると言う意味だ。生放送に代わるのは、外部入力又はあらかじめ記録したものの再放送だ。いずれの場合にも、送信器の放送中は番組の出所がなければならない。再生番組材料を構築するため追加スタジオを利用することが出来る。
各スタジオには、放送中のマイクロフォンが一つ以上、複数の再生用録音媒体(CDプレーヤ、ターンテーブル、テープデッキ) 及び番組録音用の何か(普通はテープレコーダ又はミニディスク)がある。複数の音源をミックスして編集することが出来るよう、オーディオ・ミキサー及びモニタシステムがあることもある。
小さい放送局では、スタジオが一つで一人の人間がキューを出して、録音を再生したりニュースなどをアナウンスする。一般的な音楽局では、この人は殆どの時間、放送中の歌が終わるのを待って、一寸したコメントはさみ、次のキューを出すだけである。必要な著作権料を支払うため演奏の記録を残す。.
自動システムを用いてCDトラックにキューを出す面倒な仕事に代えるのは、システムの最も明白な仕事である。最も基本的なステップは、ディスクにまつわる仕事を全部コンピュータに任せ、人は所定の時間にどの曲を再生するか撰ぶことが出来るようにする。これは、比較的小さい仕事で、我々は、もっと多くのことをさせたい。
殆どの局は、DJがしたがう演奏リストを作る。このリストには、どの歌をどんな頻度で再生するかの指針が付いている。このリストがあると、無作為に撰んだように見せかけ、必要な制約内で、何を演奏するかを決定することが出来る。
次にアナウンスがある。これは
に分けることが出来る。コマーシャルの自動化は音楽再生リストと余り変わらない。主な違いは、コマーシャルを放送する特定時刻があることだ。別の型のイベントを番組計画作成に組み込むのと、違いはない。
生番組の資料は、ニュース放送などの番組に、人手でまとめなければならないものだ。これは人がスタジオ内で(又はインターネット接続を通じて遠隔で))生でおこなうことも出来るし、予め録音しておくことも出来る。ニュースを項目のセットとして録音しておくと、後のニュース放送で前の放送の適切な部分を再使用することが出来る。いずれの場合も、別のイベントのスケジュール作成と異なることははなく、難しくはない。
私は、自動化することの出来る情報は、追加プロジェクトなので、分離した。つまり、この元のパケージにはこれを含まない。ここで思い浮かぶのは、
である。これらは両方とも、デジタルデータを人の音声に構築する以外の何物でもない。両者とも集約の問題に帰する。
放送局の中にはリクエスト申し込みを受けるところがある。これは、人手によるリクエストに対する応答、利用可能か否か及び再生リストが正しいと見なす計画回数以上は再生されていないことのチェックを意味する。これはウエブペイジを利用する完璧な場所と思われる。聴取者はリクエストを置き、ソフトウエアが演奏曲目を判断することが出来る。曲目が利用出来ないときは、その事実を告げるか又は、リクエストの多いものは購入を要請するることが出来る。
在来送信器は、このプロジェクトの範囲から遠く離れているが、送信器オプションも一応考慮する。ニカラグアの計画のためFM放送送信器を探したところでは、PCIカード上でFM放送送信をおこなう会社があった。新しいカードを作成中なので、そのためのLinuxドライバを書くよう手紙を出した。
この計画に興味がおありか、又は大学ですることがあるとお考えなら、このようなカードが入場券になるかも知れない。番組資料選択にウエブインターフェイスを用い、近くのFM受信器に放送することが出来る。 radioファンであると同時にコンピュータ・ファンでもある私は、これに大変興味がある。
これが変人の考えの全部だが、始めに言ったように、買い物リスト以上の物を差し上げたい。家族が聞くことの出来る自宅地下室の100mw放送局は商業の上客にはならないが、数万の商業局が顧客になるかも知れない。
ソリューション提案に必要なソフトウエア全部を統合するのが、最初の部分だ。次は、インストレーションとサポートになる。完全雇用職員が運営するラジオ局及び、コマーシャルに数百万ドルも支払っている広告主は、このようなシステムの利点を直ちに理解するだろう。最大の障害はソリューションにサポートがあることを示すことだ。つまり、これを撰んだため、その放送局が放送中止をしないことだ。
小型局にとって、これは誰かを呼ん問題を解決して貰えること意味する。大型局にとっては、現場職員の教育訓練を意味する。予備システム、共有サーバなどを初めとする別のレベルのサポートもある。言い換えると、同一ソフトウエアを提案するがサポートの可能性が異なる色々な市場の取り合わせになる。
次は読者次第だ。プロジェクトは説明した。残念乍ら、私には「日常業務」があって、これらをまとめる時間がない。仮にまとまっても、ソフトウエア・サポートの仕事に入る気はない。
私が望むのは、細々したことをする人がいることだ。それがこの記事を執筆した目的なのだ。私は、入力の提案、方向付けの援助、討論フォーラムのメールリスト提供、プロジェクトの広報をしたい。参加ご希望があればhttp://www.linuxgazette.com/issue96/ィmailto:phil@ssc.com" にメールして関心がある旨をお知らせ頂きたい。又は LG Projects Wiki の呼び鈴を押されたい。知らない間にLinux-制御ラジオが出るかも知れない。
Phil Hughes はLinux Journal及びLinux Gazetteの発行人である。オリンピック半島の太平洋岸にある自宅から、生涯発信し続けたいと願っている。
変な伝統的ユーザベースが沢山の科学ツールのフリーソフトウエアの概観を作った。科学的業績の重要特性は、科学的会合における研究方法と結果の公開弁論で、これは通常、プレゼンテーション又はポスターを用いて果たされる。両方とも著者自身が口頭弁論で示すためスライドか何かを沢山のツール(OpenOffice, LATEX,...)を用いて作り、ポスターセッションに合ったポスターを作る必要がある。これはA0版用紙で、内容説明が肝要である。
the GIMPなど、グラフィック取扱用の一般ツールは、ポスターの大部分を写真とアナログ画像で埋めるとき大変役立つ。それでも、科学的画像はベクトル的グラフィック・ツールを用いて扱うのが最良である。この記事では、科学ポスターにグラフィックを取り込む方法を簡単に概観する。
GIMPは、ビッチマップ即ちラスター指向のツールである。したがって、個々のピクセルを扱うのを目的とする。この方法は写真と芸術品に適している。技術図面は、別の方法を取る。これらは、連続ピクセルではなく幾何学的要素を用いて記述する方が良い。この「ベクトル的」方法には、解像度に無関係のグラフィックを作るので任意の拡大縮小が出来るとの追加利点がある。.
ベクトル的フリーソフトウエアSodipodi, Karbon14, Sketch... 幾つかを現在入手することが出来る。Gnome及びKDE デスクトップ環境に好適に組み込まれる物もある。GIMPでも、バージョン1.2以降では、極めて精緻なベクトルデザイン Gfig;のプラグインが可能で、メニュー(Filters->Render)の下にある。しかし古典X Windowアプリケーションは Xfigである。
Xfig は徹底的な検証を終えたプログラムでX Athenaウィジェット・ツールキットを用いる。したがって、成熟した製品で安定性に疑いの余地はない。締め切りが迫ることの多いポスターには大変重宝されている。
成熟したプロジェクトである当然の帰結として、Xfigには広範なユーザが様々な貢献をして来た。そのため各種分野(電子工学、UML、音楽、地図など)のため包括的な集積が作られた。
これは、情報再生が極めて直截的な読み易いテキスト・フォーマットで情報を記憶するので、信頼性のあるプログラムだ。この種のフォーマットは、SGML-に基づく近代の傾向にしたがわないで、グラフィックの記述用のASCII文字で記憶される最低限の情報から構成される。詳しい説明は、 The FIG file format か又は Debian システムのファイル/usr/share/doc/xfig/FORMAT3.2.gz.などにある。規則的なので、古典的な Unix/GNU テキストフィルタ、sed, awk などを用いる処理に適している。だからXMLフォーマットに対しASCIIを好む公算が大きい。他方、Gnuplot 及び GNU plotutils などの重要アプリケーションは、Xfigディストリビューションの範囲内で、FIGファイルを作ることが出来る。ファイルFIGAPPSの中に包括的リストを利用することが出来る。
Xfigの別の良い特徴は、LATEX フレンドリ・フォーマットを使用してエキスポートする能力があることだ。これはテキストにもグラフィックにも通用する。テキストの各断片に、'raw' でエキスポートするか 'as TEX'.でエキスポートするかを知らせる“special flag”を割り当てる。グラフィックは、ユーザの撰ぶ LATEXパケージ・オプションにしたがってコードする。これについては後で述べるので、続けて読むか又は Xfig ディストリビューションにあるLATEX.AND.XFIG 及び PDFLATEX.AND.XFIGファイルを読まれたい。
公平のため、Xfigの好ましくない特徴も明らかにしておかなければならない。悪く年取った訳ではない,Xfigには古い技術から受け継いだ欠点がある。
近代プログラムのユーザは、取消のレベルが一つなのが不満だろう。設計の際には注意が必要だ。
上述のように、Xfig はAthenaウィジェットを使うので、その制限を受ける。例えば、(編集ツールを用いるときなど)ダイアログ・ウインドウで強調文字を使うのが難しい。殆どの欧州人ユーザが不満に思っている。メタ・キイをコンポーズ・キイとして使うことが出来るのでキャンバス上でテキスト・ツールを用いる時は強調文字を作ることが出来る。
他方、Xfigは多数のエキスポート・フォーマットを用いる。中には LATEX ユーザに役立つものもある。しかし、XMLベースの SGV (伸縮可能ベクトル・グラフィック)など、新しいグラフィック・フォーマットのサポートは、未だ模索中である。
LATEX は、TEXタイプ設定システムのトップに構築されるマクロである。科学論文、科学書の出版用に広く用いられる。知らないユーザが多いが、スライドを容易に圧縮することが出来る。だがLATEX だけを用いてポスターをデザインするのは怖ろしい。沢山の対象物を2次元空間内に多分複雑な相互接続で配置しなければならないからだ。そこでXfigを用い視覚で配置を決め、後でTEXエディタを使って磨き上げることにする。
視覚作業とTEXソースコードを上手く統合するため、Xfigユーザは、広範囲のオプションで強化した。先ず、ファイルをLATEX チャンク又は完成 LATEX ファイルとしてエキスポートする。次に、所与のグラフィック要素を、ユーザがどのマクロを利用するか又は好むかにしたがって、いくつかのTEX表現に転換する。この点は次の章で論じる。
Xfig ウェブサイトもまた transfigをホストする。これは、Figフォーマットから幾つかの「デバイス」にエキスポートするプログラムfig2devを含む。この機能は、GUIからもファイル・メニューの Export オプションの下で得られる。最終目標として作業全体を出来るだけ多く自動化したいので、スタンドアローン・プログラムに重点を置く。
Fig文書のTEX 要素への転換は幾つかの方法で行うことが出来る。どの方法も、高級な LATEXパケージ、epic, eepic, eepicemu, pictex、に支払う費用により、取扱うことの出来るグラフィック要素(回転テキスト、塗り潰し四角など)の数が異なる。最高の結果は、 PostScript (又はPDF) と TeXの組合せで得られた。これはXfig画面で見る要素全部を確実に印刷出力に与える。注意事項が二つある。specially flagged テキストはXfigでは列TEXとして示されるが、最終文書では上手く活字になる。Xdvi (teTEXで記述)など幾つかのプレビューワはこの種の要素を正しく表現することが出来ない。だからdvips と PostScriptビューワを用いるのが良い。
TEXファイルを処理すると規定値でDVI(DeVice Independent)フォーマットファイルを作る。このフォーマットは容易く表示命令一式に転換する事が出来る。最終文書用に最も普及しているのは PostScriptで、殆どすべての高級プリンタが理解することの出来る完成プログラム作成言語を特徴とする。
プログラム dvips は、DVIファイルを PostScriptに転換する。これは、tetexのように主TEXパケージと一緒に配布される。これはPostScriptの強力な特徴にアクセスすることが出来るので、幾つかの面白いオプションがある。そのうち一つは、cmでもA1などの名称でも、用紙サイズを設定する能力があることである。この特徴には -t 及び-T オプションを用いてアクセスする。
dvipsの出力がA0版印刷の出来るプリンタに出力されると良い。これは余りない。代案はA4を16枚又はA3を8枚プリントすることだ。 poster パケージはPostScript1頁を数枚に区切ることが出来る。これを張り合わせて一つの画像を作る。切取線も示される Poster Debian パケージなどのように、KDEウェブサイトで入手することが出来る。
ポスターの小型コピイを作るに良いツールは psresize だ。 psutils Debian パケージに含まれている。
Xfig図面に何か変更をするには、全体プロセスを反復しなければならない。上述のステップ全部をシェル・スクリプトとして貼り合わせることを勧める。最も普及するシェルGNU bash 用に開発されたものをここに示す。Figファイルを含むディレクトリ内から以下のスクリプトを呼び出すと、全体のプロセスが実行される。著者が用いた若干のLATEX特性が要求するLATEXのもの、及びXfigエキスポートが要求する前文と後文があることに注意されたい)。
(簡単なスクリプトの挿入は、Xfigディストリビューションの中で、FigフォーマットからEPS, TeXfig2eps、への転換の実行を意味することに気付いた。論じたように、多くの場合これだけでは十分でない)
#!/bin/bash
################################################
# Processes the FIG source file for the poster #
################################################
######################################################
# #
# Usage: #
# 1. Design a poster with Xfig. #
# 2. Save it as a normal FIG file, with #
# the name, e.g., `myfile.fig'. #
# 3. Substitute `BASE=myfile' for the line #
# `BASE=poster' in this script. #
# 4. Run this script within the directory #
# where `myfile.fig' lies. #
# 5. The output files will be: #
# `myfile-a0.ps' - one poster-sized page #
# `myfile-a4-1.ps' - a4-sized mini-poster #
# `myfile-a4-16.ps' - sixteen tile pages #
# #
######################################################
# basename
BASE=poster
# convert the FIG into LaTeX + PostScript
echo '
\documentclass{article}
\usepackage{amsmath} % symbols and equations
\usepackage{amsfonts} % needed for blackboard characters
\usepackage[spanish]{babel} % titles in our language
\usepackage[latin9]{inputenc} % accented characters
\usepackage[a0paper,margin=0cm,nohead,nofoot]{geometry} % margins
\usepackage{graphicx} % including figures
\usepackage{color} % import from Xfig
\usepackage{epic} % complements the following
\usepackage{eepic} % Xfig filling
\usepackage{rotating} % text in figures
\usepackage{type1cm} % arbitrarily sized fonts
\begin{document}
' > $BASE.tex
fig2dev -L pstex $BASE.fig > $BASE.pstex
echo -n '
\begin{picture}(0,0)
\includegraphics{'$BASE'.pstex}
\end{picture}
' >> $BASE.tex
fig2dev -L pstex_t $BASE.fig >> $BASE.tex
echo '\end{document}' >> $BASE.tex
# typeset the source LaTeX
latex $BASE
# transform into a PostScript of size almost DIN A0
dvips -o $BASE-a0.ps -T 84cm,118cm $BASE
# build the small A4 version of the poster
psresize -Pa0 -pa4 $BASE-a0.ps $BASE-a4-1.ps
# build the 16 A4 pages composing the poster
dvips -o $BASE.eps -T 84cm,118cm -E $BASE
poster -mA4 -pA0 $BASE.eps > $BASE-a4-16.ps
\usepackage{color} は、Debianシステムの /usr/share/doc/xfig/README.Debianの中で提案されている。Xfig's pstex 最新版は\RGBコマンドを使用して文字色指定する。
その他のパケージは必要に応じ試行錯誤で含める。例ではそれらを使用していないが、ポスターに必要だったことのあるパケージの包括リストの説明にはなるだろう。ファイル
psresize が .ps ファイル上で及び poster が.eps ファイル上で働くことに注意されたい。したがってdvips は、-E オプション有りと無しで二度実行される。
$ xfig -paper a0 -portrait
標準tetex ディストリビューションは、規定値でビットマップ・フォントを使用する。これは離散的なmagstepを必要とするので、次のような警告がでることがある。
LaTeX フォント警告:フォント形状 `OT1/cmr/m/n' のサイズ <30> はありません (Font) 入力5行目はサイズ <24.88> で置き換え LaTeX フォント警告:相違のあるサイズ置換 (Font) 5.12pt までが生じました
transfig は、固定セットのフォントサイズを、マクロを通じて
#define TEXFONTSIZE(S) (texfontsizes[((S) <= MAXFONTSIZE) ? round(S)\
: (MAXFONTSIZE-1))])
#define TEXFONTSIZE(S) (S)
$ su Password: # apt-get remove transfig Reading Package Lists... Done Building Dependency Tree... Done The following packages will be REMOVED: transfig 0 packages upgraded, 0 newly installed, 1 to remove and 3 not upgraded. Need to get 0B of archives. After unpacking 799kB will be freed. Do you want to continue? [Y/n] (Reading database ... 67797 files and directories currently installed.) Removing transfig ... # exit $ apt-get source transfig Reading Package Lists... Done Building Dependency Tree... Done Need to get 340kB of source archives. Get:1 ftp://ftp.es.debian.org testing/main transfig 1:3.2.4-rel-4 (dsc) [652B] Get:2 ftp://ftp.es.debian.org testing/main transfig 1:3.2.4-rel-4 (tar) [326kB] Get:3 ftp://ftp.es.debian.org testing/main transfig 1:3.2.4-rel-4 (diff) [13.0kB] Fetched 340kB in 1m51s (3062B/s) dpkg-source: extracting transfig in transfig-3.2.4-rel $ vi transfig-3.2.4-rel/fig2dev/dev/texfonts.h $ cd transfig-3.2.4-rel/ $ dpkg-buildpackage -rfakeroot -uc -us ... [lots of output] ... $ cd .. $ su Password: # dpkg -i transfig_3.2.4-rel-4_i386.deb Selecting previously deselected package transfig. (Reading database ... 67734 files and directories currently installed.) Unpacking transfig (from transfig_3.2.4-rel-4_i386.deb) ... Setting up transfig (3.2.4-rel-4) ... # exit
この方法が面倒だと思うなら、この directory を見ると、大きい頁(ポスター)用の大型フォントを作る目的のスタイルファイルがある。
著者紹介:
C.E.C. Artime は、GNU のファンで、2000年以来のフリー・ソフトウエア提唱者だ。
J.A. Baroは、Linuxユーザで、1996年以来の Perl 愛好者だ。
先月号の 記事(オシロスコープを通じるLinux)で、Linuxの下でタイミングに敏感なコードを書くのに伴う問題を探求し、RTAI が優れた方法でこれを解決するのが分かった。この問題で、Computer Visionプロジェクトの私の学生が開発した面白いアプリケーションを示す。RATI理解のため私が書いたプログラムも示す。
コルト・ドーガンは記事Creating a web page controlled 2-axis movable camera with RTLlinux/Proの中で、自分の飼い猫ケプラーを常時監視することの出来る装置の構築に関するソフトウエアとハードウエアを述べている。元のwebcamは、二つのサーボモータで制御する。一つは上下に他は左右に180度振らす。両サーボの運動はリアルタイムで制御する。
この記事に刺激されて、私の学生数名がシステムの設計を始めた。結果を示す。
上下のサーボがはっきり見える。下にあるものは、その軸上にある台を回転する。(台上にwebcam)。全体を透明プラスチックで作った。下に拡大写真を示す。
5V DCで動く模型用サーボモータ(ここで用いたフタバ S2003 など)は、トルクが大きく、180度の円弧に沿う点(又は少し大きい−サーボは360度回転しない。機械的ストップが組み込んである。servo hacking(サーボ細工)にのめり込みたいなら取り去ってもよい)に位置決めする事が出来る。サーボの制御線(通常白色)には、20ms位の周期でデジタル信号を連続的に送る−周期は正確でなくとも良いが、オンの時間は正確に制御する。これがサーボの動く位置を決める。今の場合、2.2ms から 0.5msまでのオン時間で約170度サーボが動く。下に制御パルスの図を示す。
「通常」Linuxを使ってこの制御パルスを作るのは難しい−システム上の別の活動が波形を妨害する。そこで、リアルタイムRATIタスクを使用する。
リアルタイム・タスク二つがサーボを制御する。一つは上のサーボで一つは下だ。サーボ位置はリアルタイムfifo2個の助けを借りてユーザ空間からリアルタイムタスクに連絡する。先ずマクロ/変数定義を見よう(実際の回転角度は正確に測定しないのでフタバ S2003 のユーザは数値の違いを気にしなくとも良い):
#define BOTTOM_SERVO_FIFO 0 #define TOP_SERVO_FIFO 1 #define FIFO_SIZE 1024 #define BOTTOM_SERVO 0 #define TOP_SERVO 1 #define BOTTOM_SERVO_PIN 2 /* Bit D1 of parport o/p register */ #define TOP_SERVO_PIN 4 /* Bit D2 of parport o/p register */ #define TICK_PERIOD 1000000 /* 1 ms */ #define STACK_SIZE 4096 #define MIN_ON_PERIOD 500000 /* .5 ms */ #define NSTEPS 35 #define STEP_PERIOD 50000 /* 50 micro seconds */ #define TOTAL_PERIOD 20000000 /* 20ms */ #define ONE_SHOT RTIME on_time[2], off_time[2]; RT_TASK my_task1, my_task2;
全体周期を20msと定義する。on_timeアレーの0番要素に下部サーボを制御するパルスの現在オン時間を、1番要素に上部サーボのそれを記憶する。off_timeアレーについても同様である。
サーボ制御用コードを見よう:
static void servo_task(int pin)
{
while(1) {
outb(inb(0x378) | pin, 0x378);
rt_sleep(on_time[(pin >> 1) - 1]);
outb(inb(0x378) & ~pin, 0x378);
rt_sleep(off_time[(pin >> 1) - 1]);
}
}
タスクに対するアーギュメントは、制御するサーボにしたがって、BOTTOM_SERVO_PIN 又はTOP_SERVO_PINである。これらの値を1度右シフトして1を減ずれば、サーボ番号が得られる。先ず、対応するパラレルポート・ピンをハイにして、sleepを実行し−次いでピンをローにすると、タスクはもう一度sleepに入る。
ここでfifoハンドラ・コードを見ると−ユーザ・プログラムはリアルタイム・タスクと二つのfifo−サーボ毎に一つ−を通じて連絡する。ユーザ空間からいずれか一つに書込があるとき実行されるfifoハンドラは同じである。ユーザ・プログラムは「ステップ番号」つまり0から34までの整数を連絡する。
int fifo_handler(unsigned int fifo)
{
int n, r;
unsigned int on;
r = rtf_get(fifo, &n, sizeof(n));
rt_printk("fifo = %d, r = %u, n = %u\n", fifo, r, n);
if((n < 0) && (n > 34)) return -1;
on = MIN_ON_PERIOD + n*STEP_PERIOD;
on_time[fifo] = nano2count(on);
off_time[fifo] = nano2count(TOTAL_PERIOD - on);
return 0;
}
このコードは分かり易い筈だ。ステップ番号を読んで、対応する「オン時間」に転換の上on_time アレーの適切なスロットに記憶する。ハンドラに対するアーギュメントは、ユーザ空間プログラムからデータを書き込むfifo番号である。
ここから、モジュール初期化部分に入る。コードは分かり易い筈だ。
int init_module(void)
{
RTIME tick_period;
RTIME now;
rtf_create(BOTTOM_SERVO_FIFO, FIFO_SIZE);
rtf_create_handler(BOTTOM_SERVO_FIFO, fifo_handler);
rtf_create(TOP_SERVO_FIFO, FIFO_SIZE);
rtf_create_handler(TOP_SERVO_FIFO, fifo_handler);
#ifdef ONE_SHOT
rt_set_oneshot_mode();
#endif
rt_task_init(&my_task1, servo_task, BOTTOM_SERVO_PIN, STACK_SIZE, 0, 0, 0);
rt_task_init(&my_task2, servo_task, TOP_SERVO_PIN, STACK_SIZE, 0, 0, 0);
tick_period = start_rt_timer(nano2count(TICK_PERIOD));
on_time[BOTTOM_SERVO] = nano2count(MIN_ON_PERIOD);
on_time[TOP_SERVO] = on_time[BOTTOM_SERVO];
off_time[BOTTOM_SERVO] = nano2count(TOTAL_PERIOD - MIN_ON_PERIOD);
off_time[TOP_SERVO] = off_time[BOTTOM_SERVO];
now = rt_get_time() + tick_period;
rt_task_make_periodic(&my_task1, now, tick_period);
rt_task_make_periodic(&my_task2, now, tick_period);
return 0;
}
これから、モジュールをクリーンアップする:
void cleanup_module(void)
{
stop_rt_timer();
rt_busy_sleep(10000000);
rtf_destroy(BOTTOM_SERVO_FIFO);
rtf_destroy(TOP_SERVO_FIFO);
rt_task_delete(&my_task1);
rt_task_delete(&my_task2);
}
リアルタイム・タスクは、サーボを完全に制御することが分かった。多数のkernelコンパイルを走らせ、大型ファイルをコピイさせuntarrさせるなどして、システムに負荷を掛けたが、リアルタイム・タスクは十分に働くことが分かった。
低周波矩形波の周波数測定は容易だ。パラレルポート割込ピンに供給し、割込サービスルーチンを書いてルーチン内で計数を一宛増加するだけだ。この計数をリアルタイムfifo経由でユーザ空間プログラムに送付する。
リアルタイム・アプリケーションは割込を見過ごしたり、割込取扱コード実行まで割込確認後長時間経つことを許さない。「通常」Linux kernelでは、これは全く問題なのだ。Linux kernelは、コードの重要部分を実行しているとき割込を無効にする−この間、システムは外部イベントに応答しないままになる。RTAIでパッチしたkernelでは、Linuxが割込を無効にするよう命じても、実際には無効にしないで、RATIはLinux kernelが割込を見ないようにする。リアルタイム・タスクは、邪魔されないで割込を扱うことが出来る。.
パラレルポート割込ピンに入る割込の数を計数する小型プログラムを示す。関数発生器を用いて各種周波数で矩形波を発生させてこれをテストした。簡単な555タイマーに基づく回路でも同じことが出来る。
#include <linux/module.h>
#include <rtai.h>
#include <rtai_sched.h>
#include <rtai_fifos.h>
#include <asm/io.h>
#define FIFO_R 0
#define FIFO_W 1
#define TIMERTICKS 1000000000 /* 1 second */
#define STACK_SIZE 4096
#define FIFO_SIZE 1024
static int prev_total_count = 0;
static int new_total_count = 0;
static RT_TASK my_task;
static void fun(int t)
{
while(1) {
prev_total_count = new_total_count;
new_total_count = 0;
rt_task_wait_period();
}
}
int fifo_handler(unsigned int fifo)
{
char c;
rtf_get(FIFO_R, &c, sizeof(c));
rtf_put(FIFO_W, &prev_total_count, sizeof(prev_total_count));
return 0;
}
static void handler(void)
{
new_total_count++;
}
int init_module(void)
{
RTIME tick_period, now;
rt_set_periodic_mode();
rt_task_init(&my_task, fun, 0, STACK_SIZE, 0, 0, 0);
tick_period = start_rt_timer(nano2count(TIMERTICKS));
now = rt_get_time();
rt_task_make_periodic(&my_task, now + tick_period, tick_period);
rtf_create(FIFO_R, FIFO_SIZE);
rtf_create(FIFO_W, FIFO_SIZE);
rtf_create_handler(FIFO_R, fifo_handler);
rt_request_global_irq(7, handler);
rt_enable_irq(7);
outb(0x10, 0x37a);
return 0;
}
void cleanup_module(void)
{
stop_rt_timer();
rt_busy_sleep(10000000);
rt_task_delete(&my_task);
rt_disable_irq(7);
rt_free_global_irq(7);
rtf_destroy(FIFO_R);
rtf_destroy(FIFO_W);
}
rt_request_global_irq とrt_enable_irq functions は、一緒にRTAI kernel に割込んで(パラレルポート割込である)、IRQ 7 にサービスする。割込ハンドラは計数をインクレメントするだけだ。一秒毎に(我々の入力は迅速に変化しないし、長い累積計数の観測に関心がある)、リアルタイム・タスクがウエークアップして、この計数値を別の変数(prev_total_countと言う)に記憶するとともにカウンタをクリアする。ユーザ・プログラムはFIFOを経由して prev_total_count にアクセスする事が出来る。
ユーザ・プログラムはダミイ値をFIFO_Rに書込み、FIFO_Wから読取って計数する。FIFO_Rに書込む結果、fifo_handlerが実行され、これが計数をFIFO_Wに書込む。もっと良い方法があるかも知れないが、私は知らない。ユーザ・プログラムを示す。
/* User space test program */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#define FIFO_W "/dev/rtf0"
#define FIFO_R "/dev/rtf1"
main()
{
int fd1, fd2, dat,r;
fd1 = open(FIFO_W, O_WRONLY);
fd2 = open(FIFO_R, O_RDONLY);
assert(fd1 > 2);
assert(fd2 > 2);
write(fd1, "a", 1);
r = read(fd2, &dat, sizeof(dat));
assert(r == 4);
printf("interrupt count = %d\n", dat);
}
全幅3msのパルスのオフ時間を0.1ms以内の確度で測定したい。周期0.1msの周期的タスクを開始する。この周期的タスクの「awakening」毎に、信号の高低を点検する。30個のサンプルのうち信号が低であった回数を記録する。この手順を実行するコードを示す:
#include <linux/module.h>
#include <rtai.h>
#include <rtai_sched.h>
#define LPT1_BASE 0x378
#define LPT1_STATUS 0x379
#define ACK 6
#define STACK_SIZE 4096
#define TIMERTICKS 100000 /* 0.1 milli second */
#define TOTAL_SAMPLES 30 /* Take 30 samples at 0.1 ms each */
static RT_TASK my_task;
static int old_off_samples, new_off_samples;
static void fun(int t)
{
static int count = 0;
while(1) {
new_off_samples = new_off_samples + ((inb(LPT1_STATUS) >> ACK) & 0x1);
if(++count == TOTAL_SAMPLES) {
count = 0;
old_off_samples = new_off_samples;
new_off_samples = 0;
}
rt_task_wait_period();
}
}
int init_module(void)
{
RTIME tick_period, now;
rt_set_periodic_mode();
rt_task_init(&my_task, fun, 0, STACK_SIZE, 0, 0, 0);
tick_period = start_rt_timer(nano2count(TIMERTICKS));
now = rt_get_time();
rt_task_make_periodic(&my_task, now + tick_period, tick_period);
return 0;
}
void cleanup_module(void)
{
stop_rt_timer();
rt_printk("old = %u, new = %u\n", old_off_samples, new_off_samples);
rt_busy_sleep(10000000);
rt_task_delete(&my_task);
}
周期的タスクはパラレルポート・ステータスレジスタのD6番ビットを点検する。10番ピンの入力信号が低であると、これは1になる。計数は、いつものように、fifoを通じてユーザ空間に移すことが出来る。
プログラマはsemaphoreを用いて多数スレッドを同期させる。RATIには
void rt_sem_init(SEM *sem, int value);
データを書込む(又は読取る)ため定期的にバッファにアクセスする極めて優先度の高いタスクHがあるとしよう。優先度が低くて偶にほんの短時間だけ走る別のタスクLもまた、そのバッファに書込読取のためアクセスする必要があるとしよう。両タスクは、そのうち一つがアクセスする前にlookを捕捉しなければならない。lookは一時に一つのタスクだけが取得を許される。タスクLがlookを捕捉してバッファへのアクセスを開始するとする。その間に割込がタスクHのスケジューリングを生じると、タスクHもまたlookを捕捉しようとするが、タスクLが捕捉しているので、阻止される。通常の場合、タスクLは短時間で作業を終えてlookを解放するので、タスクHは続けることが出来る。だが、中優先度のタスクMがスケジュールされていると、タスクMが終わらない限り、OSはタスクLが続くのを許さない。タスクLが終わってlookを解放したときのみ、タスクHを続けることが出来る。結局、タスクHはタスクMが完了する時間だけ遅れさせられる。システム設計者がこれを見逃して、タスクHが短時間でも走らないときは時間切れにしてシステムを再立ち上げするウォッチドッグ・タイマーを構築すると−その結果は、タスクMがタスクHとタスクLとの間の入った時はいつでも、システムが再立ち上げされることとなる。
この問題を実証するプログラムを示す:
#include <linux/module.h>
#include <rtai.h>
#include <rtai_sched.h>
#define LPT1_BASE 0x378
#define STACK_SIZE 4096
#define TIMERTICKS 100000000 /* .1 second */
#define HIGH_PRIO 0
#define MEDIUM_PRIO 1
#define LOW_PRIO 2
#define PORTB 0x61
#define PIT_CTRL 0x43
#define PIT_DATA 0x42
static RT_TASK my_task1, my_task2, my_task3;
SEM flag;
RTIME tick_period;
unsigned char c = 0;
void speaker_on(void)
{
unsigned char c;
c = inb(PORTB)|0x3;
outb(c, PORTB);
}
void speaker_off(void)
{
unsigned char c;
c = inb(PORTB)&~0x3;
outb(c, PORTB);
}
void generate_tone(void)
{
/* Counter 2, low and high, mode 3, binary */
outb(0xb6, PIT_CTRL);
outb(152, PIT_DATA);
outb(10, PIT_DATA);
}
static void my_delay(unsigned int i)
{
while(i--);
}
/* Highest priority */
static void info_bus_task(int t)
{
speaker_on();
rt_sem_wait(&flag);
rt_printk("info bus task got mutex...\n");
rt_sem_signal(&flag);
speaker_off();
}
/* Medium Priority */
static void comm_task(int t)
{
my_delay(0xffffffff);
my_delay(0xffffffff);
my_delay(0xffffffff);
}
/* Low priority */
static void weather_task(int t)
{
rt_sem_wait(&flag);
rt_sleep(30*tick_period);
rt_sem_signal(&flag);
}
int init_module(void)
{
RTIME now;
//rt_typed_sem_init(&flag, 1, RES_SEM);
rt_sem_init(&flag, 1);
rt_set_periodic_mode();
generate_tone();
rt_task_init(&my_task1, info_bus_task, 0, STACK_SIZE, HIGH_PRIO, 0, 0);
rt_task_init(&my_task2, comm_task, 0, STACK_SIZE, MEDIUM_PRIO, 0, 0);
rt_task_init(&my_task3, weather_task, 0, STACK_SIZE, LOW_PRIO, 0, 0);
tick_period = start_rt_timer(nano2count(TIMERTICKS));
now = rt_get_time();
rt_task_make_periodic(&my_task1, now + 2*tick_period, tick_period);
rt_task_make_periodic(&my_task2, now + 3*tick_period, tick_period);
rt_task_make_periodic(&my_task3, now + tick_period, tick_period);
return 0;
}
void cleanup_module(void)
{
stop_rt_timer();
rt_busy_sleep(10000000);
rt_sem_delete(&flag);
rt_task_delete(&my_task1);
rt_task_delete(&my_task2);
rt_task_delete(&my_task3);
}
RTAI は `resource semaphores' をサポートする−これらは上述の問題を解決するため使用する事が出来る。我々のsemaphoreを、
rt_typed_sem_init(&flag, 1, RES_SEM);
webcam-サーボ・モータ設定は、Krishna Prasad, Mahesh 及び友人がComputer Visionプロジェクトの一部として実行した。アイデアをRTLinuxに実行したことにつきCort Douganの影響に感謝する。RTAI には良い文書と沢山のコード例が付いている。システムだけでなく、文書まで作られた大勢の人々に感謝する。
私は1997年以来GNU/Linux と基礎コンピュータ科学を教えている。時間を割く気があれば、ホームペイジpramode2.tripod.comを訪ねられたい。
著者紹介:
私は インドのカラチにあるICソフトウエアで働くインストラクタです。有機化学者になりたいと思っていましたが、可能な第二志望で満足しています。それはLinuxと取り組んで、プログラム作成を教えることです。
これはTCP/IPネットワークのデバッグの手引きである。Linux又はUnix類似OSを使用者を対象とする。
金曜日の午後5時、ユーザが$someウェブサイトに接続出来ないと言って来た。どうするか?パスはあまりない。内部又は外部サイトは、別々の方法を必要とすることが多い。
何かは変わらないだろう。こう考えて見よう。(物理)レイヤ1が働いていないときは、その上にあるもの全部が働こうとしない。telnet, ping, traceroute, tracepath など数多くのツールを使って、問題はどこか、どのレイヤで何がOKかを見極めるのは良い考えだ。pingとtracerouteがホストに対して働くとすると、ポート80でなくポート50が手に入るので、ウエブサーバが死んでいる可能性がある。ローカル・ゲートウエイは通過出来ないが、ローカル・ゲートウエイをpingすることは出来るなら、送信しない場合で、ファイアウォール構成の問題などの可能性がある。
ポート80上でthesite.comにtelenetを試して、接続出来るかを見る。接続を拒否されるならば、外向き接続をブロックするファイアウォールもプロキシもない、何かの種類のサービス休止の可能性がある。暫くそこに止まってから「接続不能」と言うときは、継続する。
リモートサイトをpingして見る。これは有用だが、ブロックICMPをする場所もある(これらは、tcp/ipを作る間に、最初の6日間で週の仕事の大部分をおこない、土曜には何もしないとの印象を持っていて、ICMPを冗談に発明したに違いない)。だからtracerouteを試すことが出来る。これもブロックされるかも知れないが、一般的に問題の所在の状態を示す。この時点で、止まった場所を見る。ローカル・ゲートウエイかゲートウエイ装置の内部ルータの筈だ。その後、ICPネットワークに入るのが分かる。ICPが見つからなくて、最初の数ステップで止まるときは、ISPへのリンクの問題である可能性がある。ICPを示して、ISP名の直後に機能休止があるときは、ICPが上流へのパスを見失い古いパスが未だ有効なので、パケットがそこで止まっている。最後に、他端まで届いて全く完了してしまうか、又は某社-gw.customer.isp.netで止まるときは、相手側が入信ICMPをブロックしている。
何も接続しないと思われるときは、IPを試すよう命じる。これが働けば、DNS設定を点検する。
一定の出来事に共通の特質。
サービスは駄目だが、ネットワークは良好なとき:ping とtracerouteが上手くいって、別のオープンポートに接続出来るとき、つまりマシンがメールとリモートアクセスをするときは、ポート22(ssh)は良いがポート25(smtp)は駄目なときは、MTAだけの問題の可能性がある。
ファイアウォールがポートをブロックする:ルータ又はファイアウォールに「全部無視」の規定値があるとき、上手く働かないが、ほとんどの人はそうしない。このマシン上でtelnetするとき、ポート25に入れないとすると、時間切れになるが、メールサーバであることが分かる。高番号ポートだけ無作為に少数のポートにtelnetしてみる。接続を拒否されるときは、IPのせいでファイヤウォールがポート25をブロックしている可能性がある。このポート入手することが出来ないのにマシンが応答するからだ。
ISPへのリンクが故障:どこかにtracerouteを試みると、時間切れでない最後のホップが自社内部からのものであることが分かり、whatever-isp.netの付いた何物も見えない。
リンクが別の側に行く:この場合、tracerouteパケットをブロックしないのが分かるので、 tracerouteするとき、自分のispから、キャリアへ、そのispへと行き、そのISPのリンクで正常に停止する。
ISPのルート決定に問題がある:プロバイダ*ahem*に起こることがある。私は、物理的に異なる場所にあり異なるプロバイダを使用する少数のマシンにアカウントを持っている。だから望みのリソースが手に入らないときは、それをLINXに直接ぶら下がるマシン及びUS ISPから離れたマシンからtracerouteして見る。そこから働き、自分からのtracerouteが、london.isp.netなどで、時間切れ又は高い遅延を示すときは、ロンドンへのリンクが使い過ぎか又は問題がある。
マシンへのログインに約2分を要する:ログインのとき、w又はwhoとタイプして、IP又はホスト名から来ていると告げるか否かを見る。ホスト名は告げない筈だ。基本的にDNS上で長く待っている。迅速に返答する内部DNSを使用するか、又はIPアドレスを逆に見る筈だ。
サービスに接続出来ないと苦情を言う人がいる。ホスト外側から手動で接続してみても役立たない。そのときは、マシンに行って、ポートにtelenetするか又はnetstat -an | grep LISTEN をおこなって、聴取中のポート番号を見る。それがあるときは、パスに沿って又はローカルホストでフィルタされている。聴取しないときは、fstat又はlsof をしてプロセス名がIPv4、又は聴取中のipアドレスとホストを示すインターネット・エントリを示すのをgrepする。
著者紹介:
David は、活動的な執筆者で、将来もっと貢献したいと考えている。
著者紹介:
David は、活動的な執筆者で、将来もっと貢献したいと考えている。
これはほんの草稿で、もっと煮詰めたいと思っている。
今日のコンピュータ・セキュリティは、驚異的だ。何時でもウイルスがいて、e-メールやircネットワークを攻撃する。通信量が膨大になって、制御不能になることもある。助ける「会社」も知らない。寧ろ事態を悪化させている。感染ホストが沢山あって、誰かが感染すると人に伝染する。opensshバグがはじめて今年のdefconで公開されたが、「一定のサークル」では数年前から知られていたものだ。こんなものが、今、どの位あるかと思う。
ソフトウエア・セキュリティには失望しつつある。勝目のない戦のように思える。各社が特効薬を売り出し、ユーザが認めている。例を挙げると、最近ウイルスが突発して多数のマシンが感染した。感染前のホストにも潜伏していたが、返事をしたものだけが感染した。これがクライアントサイトのDoSを頻繁に攻撃した。サブネットから発生したと思われ、ネットワーク全体に蔓延する。MSが走らせる応急処置サイトは、アンチウィルス・ソフトウエアが役立たぬので、極めて遅い。ISPがこのウイルスをカスタマのネットワークに発見したら、ネットワークから切り離せば、ユーザに時間の無駄がなくなると思う。
アンチウィルス・ソフトウエアには、幾つかの問題がある。
最近の騒ぎの後、「インターネットつぎはぎ」が一回っし、馬鹿者が実際に実行ファイルをクリックした。勿論、無知の言い訳は出来るけれども、車に乗って誰かにぶつけたら、言い訳など出来ない。ユーザーはコンピュータを使ったことにつき、販売者はソフトウエアの品質につき、何の責任もない。販売者が如何に不注意かはUnpatched IE security holesを訪ねると判る。
これらの多くは、プログラム作成における、一寸したヒントで止めることが出来る。Cを使うとき、学校でCを教えるときSTRCPYを使う理由は何だ。誰にもこれを使わせるな!これを使うと誰でも失敗する。コードのテスト段階で、ユーザからの入力などにstrcpyを使う不謹慎をすると必ず失敗する。
エンドユーザは、実行ファイルをクリックしない。しないだけで、理由は聞かない。誰が送ったか誰も判らない。実行もしないし pif files、bat files、scr files もしない。Word文書は使わない。HTMLの方が見掛けも良い。.
良くなる前にもっと悪くなると思われる。一つではなく1000種ものウイルスがはびこっていいるとしよう。馬鹿なソフトウエアに100,000人が応えるとしよう。安全なコンピュータはsymantec,から来るのではない。
著者紹介:
David は、活動的な執筆者で、将来もっと貢献したいと考えている。
著者紹介:
David は、活動的な執筆者で、将来もっと貢献したいと考えている。
Ctrl Aとタイプして、dキイを叩く。これで通常のシェルに戻るので、screen -listとタイプすると、スクリーン・セッション一つが所属しているのが分かる。このセッションをreattachするには、screen -xtoとタイプする。同じセッションが出る。ここでリモートホストにアカウントがあるときは、ログインしてIRCを用いて同じことをしてよい。次いでdetachしてreattachすると、新しいメッセージ全部もまた現れるので、これをどこからでもアプリケーションを終了するのに用いることが出来る。便利ではないか?
screenセッション毎に一つ以上のシェルを持ちたいとすると、screenをスタートする。次いでecho 'this is number one' とタイプする。次に Ctrl-A and nとタイプする。これで別の新ウインドウが現れる。 ctrl-a and 0を叩くと最初のターミナルに戻る。こうして、いくつも作ることが出来る。一つを廃棄するには ctrl-a and kとタイプするだけ、ctrl-a and p で元のウインドウに戻りctrl-a nで次のウインドウに入る。ヘルプにはctrl-a ?とタイプする。
他にも色々なことが出来るので、マニュアルを参照されたい。
著者紹介:
David は、活動的な執筆者で、将来もっと貢献したいと考えている。
Michael GoginsはCsoundVSTに忙殺されています。PC用のCubaseとNuendoにVSTプラグインとして働くCsoundの変形です。彼は最近、Csoundを完全にアルゴリズム的作曲言語SilenceVSTに埋込みました。これは独立でもCubase又はNuendoのPC 版に受入れても走ることが出来ます。Matt Ingallsと協力して予備的なCsoundAPIも作りました。
Gabriel Maldonadoのウインドウズ用CsoundAVもまたASIOをサポートを持っており、言語に数百のオープンGLとGUIオペコードを追加します。音響機器を、全部が同一Csound・オーケストラから来て全部が全く同じ構文を用いるGUI器具と交信させるのは素晴らしいことです。Pavan、Josep Comajuncosas、Oeyvind Brandtsegg、Alessandro Petrolatiなど多数のCsound設計者が、リアルタイムGUIベースアプリケーション、楽器、エフェクトのコレクションの集積を開発しました。
ある程度論議の余地があり急進的なCsoundのLinux版をMaurizio Umberto Puxeddu が開発し(iCsound)、現在Istvan Vargaが精力的に育てています。
その後ろでは、John ffitchが、Richard Dobsonの助けを得て、全プラットホーム用標準Csound(Canonical Csound)を維持し、改善し、拡張しています。事実、我々は現在「オペコード飢饉」(新オペコード無し)の状態なので、彼は完全にコア変更して、プラグイン・サポート、ASIOサポート、新パーサーその他諸々の新しいレベルの明確性と機能性を追加しながら、Varga、Ingalls、Gogins、Maldonadoなどが紹介した多数の新機軸をサポートすることが出来ます。(彼の緊急案件リストは、cSounds.comのニュースに投稿されています)。一つは、ffitchが仕上げた時、ユーザに取って、プログラム全体をコンパイルし直すことなく、自分のオペコードを追加するのが楽になるでしょう。
全てのプラットホームで注意しなければならないのは、Steven Yiが提唱する「陰鬱」で「定型的」な作曲と音響設計の環境です。また、Bill Beckがウインドウズ版にで生かし、Stephan BourgeoisとHans-Christoph SteinerがLinux とosX版で改良した、素晴らしいCsoundFLTK信号処理と村境設計前線「Cecilia」にも注意しなければならなりません。
全ての偉大な新しいCsound編集者とアプレット及びCsound・コードに基づく全ての無料VSTとDirectXプラグイン−Delay Lama VST プラグイン及び DobsonのCakewalk's Project 5用新 PVFXなど−など沢山のことに言及するのをを忘れていました。私に何が言えるでしょう?四年の間に、これら全てのプラットホーム上のこれらすべてのの学生、作曲者、教師、開発者に、これら全ての音楽上の夢と予測を持って、何を期待できるでしょうか?これらの新変形は全て偉大です。新オペコード全ては素晴らしい。新しい能力全ても素晴らしい。正直のところ、新しいCsound音楽と音楽家がCsoundを使う方法にぞくぞくしています。これはCsoundの新しい飛躍です。
だが、一寸待って頂きたい。夾雑物を無視していないだろうか?名前全部を思い出しただろうか?子供の喧嘩や泥仕合は?「私の変形はどの変形より良い」は、若くて優れた音楽プログラマの全てが言うことです。そう、それからも、また四年経ちました(Linux社会の人は、CsoundのLinux版で泥は全部なくなったと威張っているでしょう)。これらの成果はどうなったでしょう?多くは時間の無駄でした。癒すことの出来ない深傷を負いました。沢山の良いCsound変形−特にLinux用−がありました。そして勿論、沢山の負傷者、数百の新入者があり古参者がCsound社会から脱落してCsoundに取組むのを永久に諦めました。その人達を私は責めません。荒廃地で教えたり音楽を演奏するのに疲れました。
(csounds.comでは、過去四年に開発された各種ツールとユティリティにリンクする過去現在のCsoundニュースを見ることが出来る。またCsound・メーリングリスト・アーカイブも見出す。ここで「Csoundの将来を覆う戦争」と、「Csoundの最高支配者になる価値のあるのは誰か」との不快な子供染みた論争を回想することが出来る)
問:私の印象は、最近の商品PCプラットホームの計算力の向上が、DSPマイクロプロセッサの価格低下以上にCsoundの役に立っていることですが、どうでしょうか?ご意見をお聴かせ下さい。
答:数年間、私はSHARC DSPチップの周りに構築するCsoundの変形を開発し商業化するため、Barry Vercoe及び開発者のチーム(Barryの息子Scottyを含む−私はScottyのCsound教師だった)と Analog Devicesのプロジェクトで一緒に働きました。何かのアプリケーションように今でもあります。Barryは、このシステムの開発を続けています。そのチームの一員になって、迅速、明瞭で商品指向のCsound変形を作るのは楽しい事でしたが、私は本来のCsound、公開Csound、標準Csoundが好きです。 Analog Devicesで、我々は、もっと効率良くするためメチャメチャに言語を簡素化して再構築しましたが、その結果は一般性がなくなりました。物事をお粉留最良の方法に帰着しました。標準公開Csoundについて私が好むものは、働く方法が沢山あることです。沢山の開発者、音響設計者、教師、作曲者がAnalog Devicesで持っていない特徴を追加することです。さらに、彼らの独特の仕事と独創的な設計が、物事を進める新しい方法を示し、物事の理解を助けてくれることです。そこで驚くべきシステム、Csoundの市販版、を構築はしたけれども、私はJohn ffitch, Matt Ingalls, Michael Gogins, Richard Dobson, Gabriel Maldonadoと一緒に働き、万人が無料で使うことの出来る版のCsoundに追加し改善することを望んでいました。
四年前に、Csound.でリアルタイムMIDIコントロールが働き、リアルタイム・オーディオもまたサポートされましたが、いずれも上手く働きませんでした。当時、Csoundのどのバージョンも殆どの商業ハードウエアやソフトウエア・ツールのように明瞭で直截的には働きませんでした(事実、私はMIDIとリアルタイム・オーディオの章の殆どを"The Csound Book"から外しました。言語のこの側面は当時流動的で、書いていたのはリアルタイムMIDIとリアルタイム・オーディオを働かせるため使うべき細かな仕掛けが全てだったからです)。今日では、CsoundのALLバージョンにある改良MIDIとオーディオを用い、廉価な多チャンネルUSBとFireWireインターフェイスを用い、高速のラップトップや廉価で高速のデスクトップを用い、結局、舞台を任意の市販ハードウエア又はソフトウエア・シンセサイザの側に持って来るのためCsoundに必要なあらゆるものを手に入れ−君達はこれらの多くを見始め−多くの人がCsoundを実行し、会話的音響設計、フレーズサンプリングなどをおこなっています。
問:今日の新ユーザが抱えている問題の一つは、Csoundがバッチ指向の構文を持ち続けることです。販売部門は助けるけれども、この構文は、本当に直接Csoundを使いたいが既にオブジェクト指向言語を使用している人に取っては、後退になることがあります。Csound社会の中でCsoundの構文を変えることに付いての感触を伺えますか?
答:Csound社会に付いては話しません。これは物凄く豊富で多様で、そのことは、沢山の希望、要求、期待、偏見、先入主があることを意味します。また扱わなければならないプラットホームとOSの戦争もあります。お分かりのように、ハッカーは一つの道を望みます。作曲家は別の道を、演奏者は、プルジューサーは、音響デザイナは、それぞれ別の道を望みます。Csoundとはそんなものです。習うのは楽です。拡張も、個人化も楽です。合成と信号処理に付いて習う素晴らしい方法です。
私はCsoundが上手く働くことを望みます。何も失わないため、100%後向き互換であって欲しいと思います。同時に、リアルタイムMIDIとリアルタイム・オーディオが今日の市販アプリケーションの何れがサポートするものにも匹敵するものであって欲しいと思います。各ハードウエア・プラットホーム上で、また各OSの下で、Csoundが継目無しに他のMIDI及びオーディオ・アプリケーションを統合するのを見たいと思います。今日と遠い将来、Csoundが無料で、強力な、拡張性のある一般に役立つ万人のためのツールになって欲しいと思います。
Csoundがプラグイン/オーディオ・ユニットとして働き、Csound楽器がプラグイン及びオーディオ・ユニットとしてコンパイルされるのを望みます。(それに近づきつつあります。)John ffitchその他の重要開発者達がコアともっと強固で分かり易くして、コアとの交信を楽にするのを望みます。ユーザが簡単にソフトウエア/フリーウエア/著作権オペコード及びライブラリをプラグインすることの出来るAPIに関する仕事があります。今でもそれに近い状態にあります。
新規ユーザに取って、グラフィック指向で、親しみ易い「インターネットCsound」が数多く現れ始めています。Csoundを用いてグラフィック的に、直感的に、分かり易く即座に仕事をする方法が沢山あるためです。事実、Csoundが隠れていることを知る必要も気にする必要もありません。Ceciliaはこの型のユーザとして前々から優れており、今は遙かに改良されました。自分のモジュールを追加することにより、このシステムを確実に拡張することが出来ます(尤も既に大規模なのでその必要はないでしょうが)。自分のCsound用グラフィック・フロントエンドを作りたいときは、昔より容易になっています。マッキントッシュos9 及び osXのためにはMatt Ingalls MacCsoundでGUI機能が、Cycling74の Max/Msp/JitterでGUIツールが与えられ、ウインドウズとLinuxのためには、双方にCsound言語全体を単一外部オブジェクトとしてMatt Ingallsが埋め込んだMiller Puckette'ss PDが与えられ、ウインドウズのためには広範で優れたGabriel MaldonadoのCsoundAVのFLTKサポートが与えられています。(オペコードがLinux用にIstvan VargaのDeveloperCsoundが加わりました)。
CsoundはCではありません。一瞥して、テキスト、数値、暗号変数名すべてを持つプログラム作成言語に似ています。だが、500以上のオペコードが単なるモジュールで、変数と一緒になってパッチすることが出来るのを音楽家が理解するのに長くは掛かりません。最低(で最強)レベルで、Csoundはテキストに基づきますが、朝飯前に私の独創的Csound ツールつまり "The Csound Book," の第一章の幾つかを読んで、殆ど誰でもがCsoundの働きを理解しその力を身に付けます。直観力のあ「作品指向」のノブを回したい音楽家であると、ノイズを作り、ノブを回して自分の作ったノイズを押し潰してしまうなど、筋道がなければ、Csoundは自分のものになりません。Csoundは、ソフトウエア合成に付いて何かを知っていることを必要とする。いたずら者−つまり強力なユーザからCsoundを完全に隠すダミー・アプリケーション又はユティリティを設計するのは難しいことではありません。
問:Linux社会の多くの人は、ソフトウエア・ライセンスを大変気にします。Csoundが研究専用条項の下でライセンスされるのを、余りに厳しいと感じる人がいると思われます。例えば、バグを修復することも、自分のコピイに特性を追加することも出来ますが、変更を付けて再配布することは明らかに禁止されています。オープンソース・ライセンスを象徴する特性でなく、Csoundライセンスがこのように設定されているのには、何か理由があるのでしょうか?
答:その点に付いて言いましょう。Csoundに制限を加えるのはBarry Vercoeの意志ではありません。「教育研究」目的のためには、Csoundに何をしても構いません。販売は厄介な問題の一つと思われます。販売に関して、Bath大学の標準Csound維持者John ffitch及びcSounds.comは、MIT とBarry VercoeからCsound販売の許可を受けています。加えて、私も "The Csound Book" と "The Csound Instrument Catalog." の CDROM を販売する許可を持っています。私が開発者のその変形の販売を助けるにはどうしたら良いでしょうか?私は個人的に重要開発者全部のためウェブ空間の費用を負担し、cSounds.comを通じてプログラムの彼らの変形を販売出来るようにしています。していること、したいことを今は行うことの出来ないCsoundの無料バージョンを作る人は誰もいません。Csoundを用いて作った音楽とサンプルの売却もBarry Vercoe とMITはOKです。勿論、Csoundの販売はいけません。MITは、Csoundを用いる市販アプリケーション開発の権利をAnalog Devicesその他の会社に売却したので、彼らにははこれらの契約と権利を保護する既得利害関係があります。
未だに、我々全部はCsoundが全く無料であるか、ライセンスにおける曖昧さが明確になったらと、望んでいます。Barryと私は、この問題で過去数週間話し合いました。私は彼に中核開発者各々の観点−Csoundを用いて何をしたがっているか、現行ライセンスのどの言葉遣いがCsoundをあれこれの方向に向けるを妨げているかを示しました。最後の話し合いの間に、彼はMIT弁護士と連絡し、BarryがMedia 研の仕事とCsound の仕事をしているロシアとインドから帰国したとき会う機会を作りました。これらの話合いで新しいライセンス又は将来の開発者が言語を改良し拡張する努力を励ます新しい言葉遣いが生まれると良いと思います。
問:Csoundは、学生のための、音楽、音響、音響心理学、DSPの橋渡しをする素晴らしい学際ツールだと思います。大学環境でCsoundを使った良い経験はおありでしょうか?
答:Csoundは、コンピュータ音楽の学生の究極の教育舞台です。Csound教科書の中では合成と信号処理理論の全てが、学生の手で編集し拡張し調査することの出来る完璧で完全に働くCsound楽器を用いて述べてあり説明されています。私はバークレー音楽学校で18年間もCsoundを色々な学部で教えて来ました。この4年間は、Csoundをニューヨーク大学の大学院生に教えて来ました。東欧、西欧及び南東アフリカでCsoundの研修会、セミナーを開いて来ました。私はCsoundをバークレー大とニューヨーク大のDSPクラスでも私の Max/MSPクラスでも使います。現在、バークレー大で音楽治療用の音響心理学ツール一式を開発しているところで、私の息子Adam(Scotty大学学生)が開発した完全に新しい領域をcSounds.com に導入しようとしているところです。
Csound は、これまで合成、音響学及び信号処理の教育、学習のための優れた道具であり続けました。Csound教科書は、音楽の秘密を殆ど全て明らかにします。私の学生がCsoundを映画やTVプログラムに取り入れるとき、ビデオゲームに取り入れるとき、ロックスターのために働かせるとき、広告代理店、音楽スタディオに就職して声優と共にCsound広告を作るとき、ソフトウエア会社に就職するとき、Csound作曲がコンクールで賞を取るとき、Csoundが大学院に入る助けになるとき、音楽ツールキットでCsoundを働かせる方法を見出すとき、Csoundを教える喜びを感じます。
世界中のコンピュータ音楽の教師、学生がCsoundとCsound教科書を使っているのは素晴らしいことです。それはCsoundが優れているからで、常に改善されています。私の仕事がこれに役立つのは嬉しいことでる。コンピュータ音楽の父Max Mathewsは、良き友人でBarry Vercoeと私を助けて呉れます。彼のMusicVプログラムに刺激されて、BarryがCsoundを開発し、彼の"The Technology of Computer Music" に刺激された、私が "The Csound Book." を書きました。Barryの息子Scottyは私の学生で、私の息子Adam、バークレー大の音楽治療家、はScottyの学生でした。現在Adamは自分の音響心理学研究の為のツールをCsoundで構築中で、彼の研究ツールを通じて、Csoundを音楽治療の分野に持ち込んでいます。Csoundの将来が、これら数人の優秀は学生の手に委ねられているのは大変嬉しいことです。
私が生まれた1956年に、Max Mathews(コンピュータ音楽の父)が、MusicN言語開発の夢を持って実現しました。彼はバトンをBarry Vercoeに渡しそれがRichard Boulangerと言う名の19才の作曲家兼電子音楽家に渡されました。彼らから学んだことと、私の優秀な学生から学んだことを伝えたいと思います。私がこの会見で言ったことが、LGの読者に役立って、今日のCsoundを調べる気になって頂ければ良いと思います。
参考資料
Csoundのウェブサイト:http://csounds.com
Dave Phillipsの記事:http://www.linuxjournal.com/article.php?sid=3187
Richard Boulanger編集:"The Csound Book: Perspectives in Software Synthesis, Sound Design, Signal Processing, and Programming." 、The MIT Press、マサチューセッツ州ケンブリッジ、英国ロンドン。