ETロボコンCS行ってきました
11月16,17日に開催されたETロボコンCSに行ってきました。とりあえず、お疲れ様でした。
横浜から帰ってきて、ずっと記事を書こうと思って、気付けばもう2週間も経ってしまった(;´Д`)
風邪で寝込んだり、休んだ分の授業に追いついたり、進んでいない研究を進めたり。以外に忙しい2週間でした。
結果はと言うと、僕たちのチームが、プライマリ部門全17チーム中11位。まあまあかなって思ってます。学校としては今までに
1回行ったことはあったらしいですが、去年僕がロボコンを始めたときには当時の遺産は殆ど皆無。さらにロボット本体がNXTからEV3に変わったことで、
今までのシステムは(ブラックボックス化してたこともあって)切り捨て、今回から全く新しいシステムを組んでました。まあ、言い訳です^^;
ということで、来年に向けて、また走り出そうと思います。僕は来年アドバンス部門に出るので、色々と追加で勉強しないといけないなw
JavaでMIDIファイルを再生する
環境
- Macbook pro
- OS X Yosemite
- java version "1.8.0_77"
MIDIファイル (SMF) を鳴らしたい
学校の課題でアラームを作った時、その音をどうしてもMIDIで鳴らしたかった。そこで色々調べたので、そのメモ。
色々と情報を探してみたりはしたけど、どうも自分の思うような情報に辿り着けなかったので(自分の情報詮索能力が低いだけ・・・)、Javadocとにらめっこした結果、いろいろ見えてきた。
使いそうなクラスは次の3つ!
- Sequencer : 再生や停止など
- Sequence : トラックの生成や作成など
- MidiSystem : MIDIに関する様々な機能を提供
MidiSystemクラスは様々なメソッドがStaticで宣言されているので、インスタンスを作る必要はない。主な手続きは・・・
- Sequencerを宣言して
MidiSystem.getSequencer()
でシーケンサを取得 - Sequenceを宣言して
MidiSystem.getSequence(ファイル)
でシーケンサを取得 - このファイルは、
File file
、InputStream stream
またはURL url
のどれか - 取得したSequenceをSequencerにセットする
- Sequencerを
oepn()
し、start()
で再生。 - 止めたいタイミングで
stop()
し、Sequencerをstop()
する。
サンプル
以下のサンプルコードは、何かキーボードから入力があるまで再生、入力があったら停止するプログラム。
import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MidiSystem; import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.Sequence; import javax.sound.midi.Sequencer; public class MidiTest { public static void main(String[] args) throws MidiUnavailableException, InvalidMidiDataException, IOException { //シーケンサを宣言 Sequencer myMidi; myMidi = MidiSystem.getSequencer(); //シーケンスを宣言 Sequence mySequence ; mySequence = MidiSystem.getSequence(new File("hoge.mid")); //シーケンサにシーケンスをセットする myMidi.setSequence(mySequence); //シーケンサを開き再生する myMidi.open(); myMidi.start(); //何か入力があるまで再生。 System.out.println("入力があるまで再生します。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); br.read(); //再生の停止 System.out.println("入力を検知しました。再生を終了します。"); myMidi.stop(); myMidi.close(); } }
ETロボコン入門 ~空のアプリケーション~
筆者の開発環境
- 使用PC:Macbook pro OS X Yosemite 10.10.2
- 使用OS:EV3RT Bata6-2 (TOPPERS)
はじめに
こんにちは。最近アールグレイティーがお気に入りの筆者じょーじです。
さて、ETロボコンを初めて思うことは、どうやって開発を始めればよいのかという事ではないでしょうか。環境構築でお世話になったTOPPERSのサイトを覗いてみても
3.3. アプリケーションの新規作成
既にワークスペースにあるアプリケーションをテンプレートとして、以下の手順で新しいアプリケーションを作成できます。
① ワークスペースのフォルダに移動します
② 「cp -r <テンプレートとしたアプリケーションのフォルダ名> <新しいアプリケーションのフォルダ名>」で新しいアプリケーションを作成できます(gyroboyをテンプレートとした例
$ cp –r gyroboy newapp1
としか書いていません。ようは既存の物をコピーして使えってことなのでしょうが、
workspace
内のどのアプリケーションを見ても、何も処理がないシンプルなアプリケーションがない。C++で開発したいけど、どれもapp.c
ってなってる。じゃあどうすればいいんだ!!って感じで僕は初めの頃はずっと悩んでいました。
そこで今回はメモ書きを兼ねて空のアプリケーションを用意してみようと思います。
ファイル構成
まずはじめに、空のアプリケーションのファイル構成を見てみましょう。
ファイル名 | 説明 |
---|---|
app.h | メインのヘッダファイル |
app.cpp | メインのソースファイル |
app.cfg | タスクやリンクするオブジェクトなどを記述するコンフィグファイル |
Makefile.inc | 読み込むライブラリやオブジェクトなどを記述するメイクファイル |
たったのこれだけです。上の例でもあげたgyroboy
と同じ構成です。ではソースコードも見てみましょう。ソースコードはGitHubにsimple-project.zip
という名前でアップロードしてあるので、そちらからダウンロードしてみてください。
app.h
#ifdef __cplusplus extern "C" { #endif #include "ev3api.h" #define MAIN_PRIORITY TMIN_APP_TPRI + 1 #ifndef STACK_SIZE #define STACK_SIZE 4096 #endif /* STACK_SIZE */ #ifndef TOPPERS_MACRO_ONLY extern void main_task(intptr_t exinf); #endif /* TOPPERS_MACRO_ONLY */ #ifdef __cplusplus } #endif
これは要となるヘッダファイルです。中にはタスクに使うプライオリティの値の宣言やスタックサイズなどが記述されています。main_task
関数はMAIN_TASK
というタスクが実行状態になった時に呼ばれる関数になっています。この辺りはまた別の機会が合ったら記事にしたいと思います。
app.cpp
#include "app.h" void main_task(intptr_t unused) { ext_tsk(); } // end::main_task[]
こちらはヘッダファイルで宣言した関数の処理を記述するファイルになっています。至って普通ですね。特別なことはしていません。ext_tsk
関数はタスクを終了させる関数です。つまり今のままでは何もしないまま終了することになります。実際に動かす時は処理をwhile
でループさせたり別タスクで動かしたりすることになります。
app.cfg
INCLUDE("app_common.cfg"); #include "app.h" DOMAIN(TDOM_APP) { CRE_TSK( MAIN_TASK, { TA_ACT, 0, main_task, MAIN_PRIORITY, STACK_SIZE, NULL } ); } ATT_MOD("app.o");
このファイルにはタスクやハンドラの宣言や、オブジェクトの追加などの処理を書きます。詳しいことはタスクに関する記事を書く時にしたいと思います。またクラスなどを追加するために、新しいファイルを作りリンクさせる時は、その時のオブジェクト名をATT_MOD
関数に記述します。同時に次に説明するMakefile.inc
にも記述しなければいけないので、忘れないよう注意してください。
Makefile.inc
APPL_COBJS += \ APPL_CXXOBJS += \ SRCLANG := c++ ifdef CONFIG_EV3RT_APPLICATION # Include libraries include $(EV3RT_SDK_LIB_DIR)/libcpp-ev3/Makefile # C++ Version API Extra #include $(EV3RT_SDK_LIB_DIR)/libcpp-ev3ext/Makefile endif # $./hoge APPL_DIR += # -I$./hoge INCLUDES +=
これはいわゆるメイクファイルです。ここにはリンクしたいオブジェクトやライブラリの場所、ソースファイルが格納されているディレクトリなどを記述します。C言語オブジェクトの場合はAPPL_COBJS
に、C++オブジェクトの場合はAPPL_CXXOBJS
に追記していきます。記述する時はスペースで区切って記述する方法と\
で改行する方法の2通りあります。
#Examples APPL_COBJS += hoge1.o hoge2.o APPL_CXXOBJS += hoge3.o \ hoge4.o \
おわりに
いかがだったでしょうか。自力で調べて四苦八苦する後輩を見て、少しは資料を残してあげたいなと思い、勢いだけで書いてきました。少しでも読んでいただいた方の力になれたら嬉しいなと思います。また、このような記事が増えたらいいな、なんて考えています。僕も全国大会に向けたシステムの調整が残っているので、そこで新たなノウハウを発見したら記事にしてみようと思います。
それでは良いETロボコンライフを。
リンク
TOPPERS EV3RT:EV3RTのホームページです。
Git Hub:今回のソースコードを公開しています。
はじめに
とりあえず最初に自己紹介やら何やらをやろうかと思ったけど、既に1日考えてて先に進みそうにないので、スパッと済ませようと思います。
現在僕は大学で「TEAM八草」というチームに所属してETロボコンに取り組んでいます。この大会は主に組み込み系システムの開発を競う大会です。今回僕の所属するチームが全国大会に出場する事になったので、この機会にブログでも始めてみようと思った次第です。
ETロボコン公式ホームページ
まあぼちぼちロボコンやその他プログラミングとか趣味とかについて書いていこうと思います。