Home > Flash Archive
Flash Archive
Flash : 画像認識でアナログ時計をデジタル時計に変換する
- Posted at: 2008年9月29日 01:40
- Update: 2008年9月29日 05:05

大阪てら子17 「Flashで時計大会」で発表したやつね。webカメラと画像認識を使ってアナログ時計をデジタル時計に変換してみました。
テーマは時計だったんだけど、画像認識を勉強したかったんで、空気読まずに絡めてみたw。ARだし入力は画像かな。アナログ時計の針って直線だよね→直線が検出できて、角度がわかれば、時間の情報って抽出できるんじゃね?→WEBカメラ使えばスペック次第でリアルタイムでもいけるんじゃあ?→あーなんか使えそうなソースあるじゃん。パクろ参考に。って感じ。ちなみに今回の妄想ストーリーは「アンドロイドはアナログ時計を読めるのか?」です。
Flash : バーチャルアイドルになる!(その1) - FreeTrack + GlovePIE + Papervision3D + TTS
- Posted at: 2008年7月16日 03:13
- Update: 2008年9月29日 04:50

Flashの勉強会。大阪てら子16「アイドル!アイドル!」で発表した、「IRヘッドトラッキング+Papervision3D+TTSでバーチャルアイドルの中の人になってみよう。」の内容をまとめてみたよ。(いまごろ?とかいうな)。えーだいぶ長い。。
今回のテーマはアイドル。ってことだったんで、ストレートにPV3Dでバーチャルアイドルでも作ってみる→でもPV3Dでアニメーションとか面倒そう。。→あーヘッドトラッキングとかやってみたいんだよ→生の人間の動きをトレースさせたら、中の人がいるっぽく見えるんじゃね?楽できるんじゃね?→ついでにOSCパケットをリアルタイムで扱うテストもしよう。うん。という感じで始めました。
Progression : Napsterのブログパーツを作る(その0) - 準備とか
- Posted at: 2008年4月24日 01:03
- Update: 2008年4月24日 14:02

AS3用フレームワークのProgression Frameworkを使って、ブログパーツみたいなFlashを作りまーす。とりあえず今回は準備編。
いろいろあったけど生まれ変わった定額制の音楽ダウンロード・配信サービス Napster。売れ筋のCDは少ないけど、こっちで売ってないEP盤とかマイナーな曲があったり、レビューも充実(?)してたりと結構便利。なんせ定額で聴き放題ってのがイイ。毎週水曜くらいに新規追加されたニューリリースが更新されるんですが、アプリがWindows専用なので、Macでは使えません。いちいち違うところにあるWindowsパソコンを見にいくのが面倒なんです。ええ。
なもんでニューリリースの情報がいつでも見れるように、あとProgressionの勉強も兼ねて、ブログパーツみたいなものを作ろう!かと思います。
NDS : NintendoDSをFlashで使う(その5) - Flashと連携
- Posted at: 2008年2月18日 00:25
- Update: 2008年6月11日 13:21

ええかげん書ききらないと。出力側のFlashも作る。動作の動画だけ撮って、できた!ってことでいいかなぁ。。 えーと。。ソース嫁。
このエントリは書きかけの内容が含まれます。気がむいたら随時更新されます。
勉強会:第11回 大阪てら子「なぎまぐの Flash ライブコーディング featuring たけし(休)」に行ってきたよ
- Posted at: 2008年1月30日 16:18
- Update: 2008年4月14日 01:58
たまにはレポートも書かないとねー。関西屈指のキワモノツワモノ共が集うFlash/ActionScript道場。第11回 大阪てら子「なぎまぐの Flash ライブコーディング featuring たけし(休)」に行ってきたよ。
参加者は○名(わすれた)、発表は3名。
ライブラリを使わずに3D(Flash ライブコーディング)
発表者はなぎまぐさん。
ライブコーディングで、マウスに追随してグルグル廻すデモを作る。
- マウスの座標をキーにアフィン変換で座標変換する。
- 動くと結構かっこいい。
気抜いてる間にいつの間にかできてました。。グルグル。
寒いし雪でも降らせよう(Flash ライブコーディング)
たけしCEOが体調不良でお休みなので、さくーしゃさんが急遽登板。
ライブコーディングで、雪のパーティクルを降らせるデモを作る。
- 1ピクセルのビットマップでパーティクルを作って落とす。
- Bitmapのカンバスを作って、その中を描き直すことでアニメーションさせる。
- いっぱい→各点のX、速度をランダムで降ってくる感じに。
- 文字の形に降らせる。文字のBitmapを置いてスキャン→白に当たったら雪を生成。
- forcemapを使って積もらせる。積もらせる形を描いて背景に置く。→雪の位置の背景をスキャン→速度を変える。黒:速い、白:遅く→積もってるように見える。
- キラキラ点滅はローテクで回避w。こーゆーのがいい。キラキラ用に1/4のサイズの新しいカンバスを作る→smoothingつけて4倍の大きさで配置→加算モードで合成→雪を動かすときにキラキラ用のカンバスにDraw→1/4にした時に点がたまに消える+拡大smoothingでグローぽく。キラキラ。
- パーティクルするならBitmapのが速い。
- 処理中は表示するまでStageをロックしとくと、なんとんく速くなる。
→http://saqoosha.net/2008/01/28/634/
ASでの12色環へのアプローチ
WCAN@名古屋の山ゴンさんが飛び入りで発表してくれました。
バウハウスの12色環のアレをASで書いて見よう。という内容。
- 画像から色を抽出→3色からイイ感じの合成色を生成する。
- エロい展開を期待してたのはあたしだけじゃないはず。。
→http://ra66it.net/blog/index.php?ID=739
その他:話題に出たこと
・Flash Develop vs Flex Builder
・delegate再び。
・ライブコーディングするなら事前に練習しよう。
えーと。あとは覚えてない。。
まーそんな感じ。宣伝効果があったのか、新しい人もたくさんいて新鮮でしたw。
いつも場所を提供して下さるCOLORSさん。スピーカーの皆さんありがとうございました。
次回は2/16(土)。1周年らしいですわよ。
NDS : NintendoDSをFlashで使う(その4) - Serverの準備
- Posted at: 2008年1月24日 12:05
- Update: 2008年4月14日 01:57
はいはーい。DSとFash間で通信するためのソケットサーバを作りますよ。
とりあえずソケット通信でデータを受け取ってFlashに投げてやったらいいのです。バイナリー形式の方が後で便利なんだろーけど、テキストだけでもいいんです。カンタンなチャットサーバみたいなのをでっちあげましょう。
が、わたくし通信周りはさっぱりわかりません。「ActionScript 3.0 ゲームプログラミングブック」を出しておられるnpakaさんのところに、ソケット通信のサンプルとJavaのサーバのソースがあったので、拝借させてもらいます。あ、Javaなんで、適当に環境整えてください。というか「あかねと~く」の人だったのか。。
//メイン
public static void main(String[] args) {
ChatServer server=new ChatServer();
server.start(16000);
}
server.start(16000) てところで使うポートを指定してます。任意で変えましょう。

Serverを起動させます。「チャットサーバ実行開始」とコンソールに出力され、クライアントの接続を待ちます。次に勝手アプリをマジコン上で起動させます。接続に成功すると「CONNECTED SUCCESS」とコンソールに表示されます。

タッチペンやボタンを操作すると、「{"p":1,"x":10,"y":50}」というデータがDSからPC側のServerに送られているのを確認できます。できるはず。。
関連エントリ:
- (その1) - 概要とWiFi環境
- (その2) - DSとFlashをMIDIで繋げる
- (その3) - DSの勝手アプリを作るお
- (その4) - Serverの準備
- (その5) - Flashと連携
参考資料:
NDS : NintendoDSをFlashで使う(その3) - DSの勝手アプリを作るお
- Posted at: 2007年12月19日 17:10
- Update: 2008年6月11日 13:31
入力側のDSの勝手アプリを作るお。よくわかってないので要所とソースだけさらっと書くだけ。あとはコード嫁。
とりあえず実装するもの
・ボタン入力
・タッチペン入力
・フレームバッッファ
・WiFi出力
ボタン入力
scanKeys() をV-Blank の割込みハンドラで呼び、keysHeld()、keysDown()の関数でその時の十字キー、A、B、X、Y、L、R、START、SELECTキーの状態を取ります。
KEYPAD_BITS keys;
{
scanKeys(); // キー入力状態を NDS ライブラリ内変数に取り込む
keys= keysDown(); // ボタン情報の取得
if (keys& KEY_A) { // Aボタンのダウンエッジ検査
shoot(); // 何ぞ処理
}
}
タッチペン入力
libndsのAPIでタッチペンの座標と状態を取ります。touchReadXY()をV-Blank の割込みハンドラで呼び、タッチパッドの情報を取ります。ダウンエッジの検出を忘れずに。
touchPosition touchXY;
int tx, ty;
{
if (keyHeld() & KEY_TOUCH) { // ペンのダウンエッジを検査
touchXY = touchReadXY(); // タッチパッドの情報を取得
tx = touchXY.px; // xの座標
ty = touchXY.py; // yの座標
}
}
フレームバッファ
メモリ領域にデータを書くと、そのデータはスクリーンに表示されるスクリーンモードです。タッチペンを置いたところに矩形を表示させてみます。
// VRAMを指定した座標、色で塗りつぶす
void draw(int x, int y, uint16* buf, uint16 c) {
buf += y * SCREEN_WIDTH + x;
int i;
for(i = 0; i < shape_height; i++) {
uint16* line = buf + SCREEN_WIDTH * i;
int j;
for(j = 0; j < shape_width; j++) {
*line++ = c;
}
}
}
// メイン
int main(void) {
// 初期化
videoSetMode(MODE_FB0); //フレームバッファモード
videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE); //グラフィックエンジンのモードを指定。アクティブにして使用するBGも設定
vramSetMainBanks(VRAM_A_LCD, VRAM_B_LCD, VRAM_C_SUB_BG, VRAM_D_LCD); //VRAMの使用領域設定
SUB_BG0_CR = BG_MAP_BASE(31);
BG_PALETTE_SUB[255] = RGB15(31,31,31);
consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(31), (u16*)CHAR_BASE_BLOCK_SUB(0), 16);
while(1) {
// このへんにタッチパッドの入力とか
// 前の■のあった場所を塗りつぶす
draw(old_x, old_y, VRAM_A, RGB15(5, 5, 5));
// 新しい四角を塗りつぶす
draw(shape_x, shape_y, VRAM_A, RGB15(0,31,0));
swiWaitForVBlank(); // VBLANKを待つ
}
}
WiFi出力
チュートリアルがほとんど無いので、サンプルコードを読んだ方が早いです。Stephen Stair氏のサンプル(dswifi_lib_v0.3a_full)の中のwifi_exampleの方か、DSMIのサンプルアプリのソース。日本語ではNDSD Wikiにあった初期化のサンプル(消えたっぽい)がありますんで、ぐぐぐっと眺めてるとなんとなくわかるハズ。
WiFiはARM7からしかアクセスできないんで、FIFOを使ってARM9>>>ARM7のCPU間通信させるあたりではまった。
Stephen Stair氏のwifi_lib_testの方ではいろいろできる感じなので触ってみるといいかも。なおdswifiの最新版はSourceForgeの方で開発、公開されています。仕様も変わるかもしれんのであしからず。
出力形式
容量が小さく、扱いやすいように今回はJSON形式で送ることにします。
{"vx":"1","vy":"10","vs":"1"}
できたもの
上の例と違ってるとこもあるけどこんな感じになる。
・ARM7のソース
#include "nds.h"
#include "stdlib.h"
#include "dswifi7.h"
int vcount;
touchPosition first,tempPos;
void startSound(int sampleRate, const void* data, u32 bytes,
u8 channel, u8 vol, u8 pan, u8 format) {
SCHANNEL_TIMER(channel) = SOUND_FREQ(sampleRate);
SCHANNEL_SOURCE(channel) = (u32)data;
SCHANNEL_LENGTH(channel) = bytes >> 2 ;
SCHANNEL_CR(channel) = SCHANNEL_ENABLE | SOUND_ONE_SHOT
| SOUND_VOL(vol) | SOUND_PAN(pan) | (format==1?SOUND_8BIT:SOUND_16BIT);
}
s32 getFreeSoundChannel() {
int i;
for (i=0; i<16; i++) {
if ( (SCHANNEL_CR(i) & SCHANNEL_ENABLE) == 0 ) return i;
}
return -1;
}
void VcountHandler() {
static int lastbut = -1;
uint16 but=0, x=0, y=0, xpx=0, ypx=0, z1=0, z2=0;
but = REG_KEYXY;
if (!( (but ^ lastbut) & (1<<6))) {
tempPos = touchReadXY();
if ( tempPos.x == 0 || tempPos.y == 0 ) {
but |= (1 <<6);
lastbut = but;
} else {
x = tempPos.x;
y = tempPos.y;
xpx = tempPos.px;
ypx = tempPos.py;
z1 = tempPos.z1;
z2 = tempPos.z2;
}
} else {
lastbut = but;
but |= (1 <<6);
}
if ( vcount == 80 ) {
first = tempPos;
} else {
if ( abs( xpx - first.px) > 10 || abs( ypx - first.py) > 10
|| (but & ( 1<<6)) ) {
but |= (1 <<6);
lastbut = but;
} else {
IPC->mailBusy = 1;
IPC->touchX = x;
IPC->touchY = y;
IPC->touchXpx = xpx;
IPC->touchYpx = ypx;
IPC->touchZ1 = z1;
IPC->touchZ2 = z2;
IPC->mailBusy = 0;
}
}
IPC->buttons = but;
vcount ^= (80 ^ 130);
SetYtrigger(vcount);
}
void VblankHandler(void) {
u32 i;
//sound code
TransferSound *snd = IPC->soundData;
IPC->soundData = 0;
if (0 != snd) {
for (i=0; i<snd->count; i++) {
s32 chan = getFreeSoundChannel();
if (chan >= 0) {
startSound(snd->data[i].rate, snd->data[i].data, snd->data[i].len,
chan, snd->data[i].vol, snd->data[i].pan, snd->data[i].format);
}
}
}
Wifi_Update(); // VBlank時にWifi情報をアップデートする
}
// コールバック関数
// ARM9へWiFiライブラリのメッセージを通知する
void arm7_synctoarm9() { // FIFOメッセージの送信
REG_IPC_FIFO_TX = 0x87654321;
}
// 割り込みハンドラ
// ARM9からの入力を通知する
void arm7_fifo() { // FIFOメッセージの入力チェック
u32 msg = REG_IPC_FIFO_RX;
if(msg==0x87654321) Wifi_Sync();
}
int main(int argc, char ** argv) {
// enable & prepare fifo asap
REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR;
// Reset the clock if needed
rtcReset();
// read User Settings from firmware
//readUserSettings();
//enable sound
powerON(POWER_SOUND);
writePowerManagement(PM_CONTROL_REG, (
readPowerManagement(PM_CONTROL_REG) & ~PM_SOUND_MUTE )
| PM_SOUND_AMP );
SOUND_CR = SOUND_ENABLE | SOUND_VOL(0x7F);
// Set up the interrupt handler
irqInit();
irqEnable(IRQ_VBLANK | IRQ_VCOUNT);
SetYtrigger(80);
irqSet(IRQ_VCOUNT, VcountHandler);
vcount = 80;
irqSet(IRQ_WIFI, Wifi_Interrupt); // WiFi 割り込みのセット
irqEnable(IRQ_WIFI);
{ // WiFi の初期化と ARM9 との同期
u32 fifo_temp;
while(1) { // マジックナンバーがセットされるまで待つ
while(REG_IPC_FIFO_CR&IPC_FIFO_RECV_EMPTY) swiWaitForVBlank();
fifo_temp=REG_IPC_FIFO_RX;
if(fifo_temp==0x12345678) break;
}
while(REG_IPC_FIFO_CR&IPC_FIFO_RECV_EMPTY) swiWaitForVBlank();
fifo_temp=REG_IPC_FIFO_RX; // Wifi_Init 用の値を取得
Wifi_Init(fifo_temp);
irqSet(IRQ_FIFO_NOT_EMPTY,arm7_fifo); //FIFO IRQ のセット
irqEnable(IRQ_FIFO_NOT_EMPTY);
REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_RECV_IRQ;
// WiFi LIB が初期化されたことをARM9に通知
Wifi_SetSyncHandler(arm7_synctoarm9);
} // arm7 wifi init complete
// 割り込みだけ有効にして後は待つ
while (1) {
VblankHandler();
swiWaitForVBlank();
}
return 0;
}
・ARM9のソース
#include <nds.h>
#include <stdio.h>
#include <string.h>
#include <dswifi9.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
//---------------------------------------------------------------------------------
#define VCOUNT (*((u16 volatile *) 0x04000006))
#define PEN_DOWN (~IPC->buttons & (1 << 6))
touchPosition touchXY;
int touch_was_down = 0;
int my_socket;
static int old_x = 0;
static int old_y = 0;
static int shape_x = 0;
static int shape_y = 0;
static int shape_width = 4;
static int shape_height = 4;
static char * sendStr = "o";
//---------------------------------------------------------------------------------
// Dswifi helper functions
// WiFi タイマー関数
// sgIPのアップデート
void Timer_50ms(void) {
Wifi_Timer(50);
}
// ARM7へFIFOメッセージを通知する関数
void arm9_synctoarm7() { // FIFOメッセージを送る
REG_IPC_FIFO_TX=0x87654321;
}
// 割り込みハンドラ
// ARM7からのFIFOメッセージを取得する
void arm9_fifo() { // FIFOメッセージの入力をチェック
u32 value = REG_IPC_FIFO_RX;
if(value == 0x87654321) Wifi_Sync();
}
// フレームバッファで短型を動かす
//---------------------------------------------------------------------------------
void draw(int x, int y, uint16* buf, uint16 c) {
//---------------------------------------------------------------------------------
buf += y * SCREEN_WIDTH + x;
int i;
for(i = 0; i < shape_height; i++) {
uint16* line = buf + SCREEN_WIDTH * i;
int j;
for(j = 0; j < shape_width; j++) {
*line++ = c;
}
}
}
// Vblank割り込み時の処理。
//---------------------------------------------------------------------------------
void VblankHandler() {
//---------------------------------------------------------------------------------
sendStr = "";
int keys[16] = {0};
scanKeys();
touchXY = touchReadXY();
int held = keysHeld();
if(held & KEY_UP) {
keys[0] = 1;
}
if(held & KEY_DOWN) {
keys[1] = 1;
}
if(held & KEY_RIGHT) {
keys[2] = 1;
}
if(held & KEY_LEFT) {
keys[3] = 1;
}
if(held & KEY_A) {
keys[4] = 1;
}
if(held & KEY_B) {
keys[5] = 1;
}
if(held & KEY_X) {
keys[6] = 1;
}
if(held & KEY_Y) {
keys[7] = 1;
}
if(held & KEY_R) {
keys[8] = 1;
}
if(held & KEY_L) {
keys[9] = 1;
}
if(held & KEY_START) {
keys[10] = 1;
}
if(held & KEY_SELECT) {
keys[11] = 1;
}
if(!touch_was_down && PEN_DOWN) {
touch_was_down = 1;
keys[12] = 1;
keys[13] = touchXY.px;
keys[14] = touchXY.py;
iprintf("\x1b[5;0H");
iprintf("Touch x / y = %03d / %03d\n", touchXY.px, touchXY.py);
}
else if(touch_was_down && !PEN_DOWN) {
touch_was_down = 0;
}
else if(touch_was_down && PEN_DOWN) {
keys[12] = 2;
keys[13] = touchXY.px;
keys[14] = touchXY.py;
iprintf("\x1b[5;0H");
iprintf("Touch x / y = %03d / %03d\n", touchXY.px, touchXY.py);
}
old_x = shape_x;
old_y = shape_y;
shape_x = touchXY.px;
shape_y = touchXY.py;
draw(old_x, old_y, VRAM_A, RGB15(5, 5, 5));
draw(shape_x, shape_y, VRAM_A, RGB15(0,31,0));
if(held) {
sprintf(sendStr,"{\"au\":%d,\"ad\":%d,\"al\":%d,\"ar\":%d,\"ba\":%d,\"bb\":%d,\"bx\":%d,\"by\":%d,\"bl\":%d,\"br\":%d,\"bs\":%d,\"be\":%d,\"pp\":%d,\"px\":%d,\"py\":%d}\n",
keys[0], keys[1], keys[2], keys[3], keys[4], keys[5], keys[6], keys[7], keys[8], keys[9], keys[10], keys[11], keys[12], keys[13], keys[14] );
send( my_socket, sendStr, strlen(sendStr), 0 );
}
VBLANK_INTR_WAIT_FLAGS |= IRQ_VBLANK;
}
//---------------------------------------------------------------------------------
int main(void) {
//---------------------------------------------------------------------------------
powerON(POWER_ALL);
videoSetMode(MODE_FB0); //フレームバッファモード
videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE); //グラフィックエンジンのモードを指定。アクティブにして使用するBGも設定
vramSetMainBanks(VRAM_A_LCD, VRAM_B_LCD, VRAM_C_SUB_BG, VRAM_D_LCD); //VRAMの使用領域設定
SUB_BG0_CR = BG_MAP_BASE(31);
BG_PALETTE_SUB[255] = RGB15(31,31,31);
consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(31), (u16*)CHAR_BASE_BLOCK_SUB(0), 16);
// ARM7 の WiFi 機能を初期化するためのFIFOメッセージを送る
{
REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR; // FIFOの有効&クリア
u32 Wifi_pass= Wifi_Init(WIFIINIT_OPTION_USELED);
REG_IPC_FIFO_TX=0x12345678;
REG_IPC_FIFO_TX=Wifi_pass;
*((volatile u16 *)0x0400010E) = 0; // Timer3 無効
irqInit();
irqSet(IRQ_TIMER3, Timer_50ms); // Timer IRQ のセット
irqEnable(IRQ_TIMER3);
irqSet(IRQ_FIFO_NOT_EMPTY, arm9_fifo); // FIFO IRQ のセット
irqEnable(IRQ_FIFO_NOT_EMPTY);
irqEnable(IRQ_VBLANK); // Vblank IRQ のセット
REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_RECV_IRQ; // FIFO IRQ 有効
Wifi_SetSyncHandler(arm9_synctoarm7); // WiFi ライブラリに ARM7への通知用関数をセットする
// Timer3 のセット
*((volatile u16 *)0x0400010C) = -6553; // 6553.1 * 256 cycles = ~50ms;
*((volatile u16 *)0x0400010E) = 0x00C2; // enable, irq, 1/256 clock
while(Wifi_CheckInit()==0) { // ARM7 の初期化終了待ち
while(VCOUNT>192); // VBlank 待ち
while(VCOUNT<192);
}
}
// WiFi 初期化終了 ここからWiFi ライブラリが使えるようになります
// 単純な接続
{
int i;
// Wifi_AutoConnect では、AOSS 機能は使えないらしいです。
// WEPの設定をDS本体から読んできます。
Wifi_AutoConnect(); // 接続要求
while(1) {
i=Wifi_AssocStatus(); // ステータスチェック
if(i==ASSOCSTATUS_ASSOCIATED) {
iprintf("Connected successfully!\n");
break;
}
if(i==ASSOCSTATUS_CANNOTCONNECT) {
iprintf("Could not connect!\n");
while(1);
break;
}
}
}
// 接続成功したら、ここからソケットインターフェイスを使ってインターネットに接続することができます。
// gethostbynameでIPアドレスに返す。直接IPでも。
struct hostent * myhost = gethostbyname( "10.0.2.1" );
iprintf("Found IP Address!\n");
// SOCK_STREAM 型のソケットを作る。TCPってこと。
my_socket = socket( AF_INET, SOCK_STREAM, 0 );
iprintf("Created Socket!\n");
// 指定したポートにソケットが繋がるか尋ねてみる。
struct sockaddr_in sain;
sain.sin_family = AF_INET;
sain.sin_port = htons(16000); // ポートを指定。なんとなく16000にしてみた。
sain.sin_addr.s_addr= *( (unsigned long *)(myhost->h_addr_list[0]) );
connect( my_socket,(struct sockaddr *)&sain, sizeof(sain) );
iprintf("Connected to server!\n");
// 接続確認のメッセージを送る。
char * sendStr = "CONNECTED SUCCESS";
send( my_socket, sendStr, strlen(sendStr), 0 );
/*
必要ならこの辺で返ってきたメッセージを受信させるといいんじゃないかな。
*/
while(1) {
VblankHandler();
swiWaitForVBlank();
}
//return 0;
}
コンパイル
WiFiのライブラリが無いよ。ってコンパイルに失敗する場合はMakefile内の、静的リンクライブラリを指定するLIBSの行で、-lnds9より前に-sdwifi9を持ってくると通る感じです。lnds7も同じです。
LIBS := -ldswifi9 -lnds9
さくっとビルドしてあげましょう。動作確認は。。次に進んでから。。
関連エントリ:
- (その1) - 概要とWiFi環境
- (その2) - DSとFlashをMIDIで繋げる
- (その3) - DSの勝手アプリを作るお
- (その4) - Serverの準備
- (その5) - Flashと連携
参考:
NDS : NintendoDSをFlashで使う(その2) - DSとFlashをMIDIで繋げる
- Posted at: 2007年12月18日 14:54
- Update: 2008年4月14日 01:53
ちょっと脱線。MIDI経由でDSとFlashを繋げます。DSをMIDI機器にするDSMIと、入力にMIDIが使えるAdobe AIRアプリVispで動いているのを見てみます。こんな方法もあるよ程度に。
DSMI (DSMIDIWiFi)
http://dsmidiwifi.tobw.net/
DSをMIDI機器として扱えるライブラリとアプリ。
サンプルアプリ
・DS MIDI Keyboard (MIDIキーボード)
・Kaos DS (Kaos Padみたいにタッチパッドでコントロール)
・Pulse DS (DSのPSG音源をMIDI経由で鳴らす)
Visp
http://visp-vj.com/
AIRアプリなVJツール。入力にMIDIが使える。→動作デモ
インストールと実行
DSMIのインストール
・サンプルアプリ(とりあえずKaos DS)をダウンロード→MicroSDにコピー
・使用OS用のDSMIDIWiFi Serverをダウンロード→コピー(どこに入れても可)
Vispのインストール
・Adobe AIRの実行環境をダウンロード→インストール
・Vispをダウンロード→ダブルクリックでインストール
・visp MIDI Proxyをダウンロード
アプリケーションの実行
・先にWiFiの設定をすましておく。
・マジコンをDSに挿してKaosDSを実行。
・DSMIDIWiFi Serverを実行。(OS XでMIDI機器として認識しない場合はmmjかMandolane MIDI SPIなどJavaのライブラリをインストールしてください。)
・VispにMIDI入力の登録 (チュートリアル参照)
・visp MIDI Proxyを実行→MIDI機器を選択→Start MIDI Connectionをクリック
・vispを実行
後は適当にタッチパッドを動かせば、アプリ側のスライダーやパッドが反応するのが確認できるハズ。
だいぶ回りくどい。。
DS → → (socket) → → DSMIDIWiFi Server → → (MIDI Message) → →
→ → visp MIDI Proxy → → (socket) → → visp
てな感じでだいぶ無駄が多いです。。
とにかく簡単にやりたいんでDSMIを使うのを前提に調べてみたけど、意外にもFlashでMIDIを扱う方法があまり無い感じ。「Flash MIDI」というFlashプラグイン(?)があるけどAS2だったんで断念。というか中身読んでない。オープンソースなRTMPサーバの「Red5」でもMIDIを使えるようなんだけど、サンプルがよくわからないんで断念。一括して揃ってたVispにしてみました。機能があれこれ実装されると面白そうなんだけど、開発が進んでないような。まー動いたのは確認できたんで。コレはここまで。
次はちゃんとDSの勝手アプリを作るよ。
関連エントリ:
- (その1) - 概要とWiFi環境
- (その2) - DSとFlashをMIDIで繋げる
- (その3) - DSの勝手アプリを作るお
- (その4) - Serverの準備
- (その5) - Flashと連携
参考資料:
NDS : NintendoDSをFlashで使う(その1) - 概要とWiFi環境
- Posted at: 2007年12月 8日 00:16
- Update: 2008年4月14日 01:51

みんな大好きNIntendoDSとFlashを連携させてみた。G_orzさんのProcessingとDSを繋げるデモを目標に作ってみまーす。開発環境はOS Xを前提でやります。
わかりにくいけどシステム構成は↑の図な感じになります。
Stephen Stair氏によって公開されているdswifiライブラリで勝手アプリでもWi-Fiを使ってソケット通信ができます。もちろんFlashもソケット通信ができます。なもんで、DSで何か入力→ソケットをで投げる→Flashで受け取る→何か出力。という構成ができます。
ただ、Flashだけではサーバのようにソケット受信だけを待つことができません。そこで、間にソケット通信サーバを立てることにします。チャットサーバのようなテキストを投げ返すだけの簡単なものでできるハズです。
用意するもの
・Nintendo DS/Nintendo DS Lite
・NDS用のマジコン
・ニンテンドーWi-Fiコネクション対応ゲーム
DSは買ってください。マジコンも買ってください。手に入りやすいのはR4系だと思います。アキバか日本橋のPC屋をいくつか廻れば4〜6000円くらいであるはずです。とりあえずM3 Simply(中身はR4と同じ)を前提で進めていきます。Wi-Fi対応ゲームはWi-Fiの設定するのに使います。買ってください。
作るもの
・入力となるDSの勝手アプリ
・ソケット通信サーバ
・出力となるFlash
マジコンでHomebrewと呼ばれる勝手アプリが実行できます。カンタンなアプリならライブラリとチュートリアルですぐできます。ソケット通信サーバは機能さえ実装できれば何で作ってもいいです。とりあえずJavaでやります。Flashも動けばいいのです。なんとなくAS3でやります。
DS開発環境
・devkitPro
・DSLua
DSLuaの方が簡単だけど、うまく動かないことがあるのでdevkitProでいきます。
Sourceforgeにある以下のファイルをダウンロード→インストール。
・devkitARM
・dswifi (devkitARMの中のが古ければ更新)
・libnds (同上)
・examples (同上)
Cコンパイラの環境がいるので。OSXな人はDeveloper Toolsをインストール。
OSXのインストールディスクに付いてます。お好きな環境がある人は適当に構築。
アプリケーション→ユーティリティ→ターミナルを起動。
デフォルトでは/opt/local/devkitPro/にインストールされているので、
examples下の適当サンプルフォルダまで移動→ビルドしてみてエラーが無く.ndsファイルが無事生成されればおkです。
Wi-Fiの設定
・OS X編
・Windows編はやらない
何はともあれWi-Fiに繋ぎます。グローバルに繋がっているポートを、AirMacでインターネット共有させ、指定したIPで繋げます。
Mac:ネットワークの設定
1. システム環境設定→ネットワーク
Mac:共有の設定
1. システム環境設定→共有→インターネットのタブを開ける
2. 「共有する接続経路」を選択。(とりあえず内蔵 Ethernet)
3. 「相手のコンピュータが使用するポート」はAirMacを選択。
4. 「AirMacオプション」でネットワーク名を設定。(メモしとく)
5. この時、WEPはあっても無くても可。(設定するならメモ)
6. 「開始」でインターネット共有を開始。
NDS:Wi-Fiの設定
1. 「ニンテンドーWi-Fiコネクション対応ゲーム」を起動。
2. WiFiコネクション設定→Wi-Fi接続先設定→接続先をどれか→手動を選択。
3. 「SSID」はメモしたネットワーク名を設定。
4. 「WEPキー」は設定したならメモした内容を設定。
5. 「IPアドレス自動取得」はしない。
6. 「IPアドレス」は10.0.2.51〜10.0.2.254あたりで重複しないように。
7. 「サブネットマスク」は255.255.255.0。
8. 「ゲートウェイ」は10.0.2.1。
9. 「DNS自動取得」はしない。
10.「プライマリDNS」は10.0.2.1。
11.「セカンダリDNS」は無視。
12.最後に「接続テスト」で通信が成功すればおk。
OS Xでローカルに繋ぐ場合
ローカル環境だけで使うにはこーします。
ネットワーク設定

共有設定

ずっとPC側のIPを10.0.2.2を指定してローカルで使えねー!とか勝手に思ってた罠。。勝手アプリ側で指定したServerのIPにしてやります。今回のでは10.0.2.1ですね。後はAirMacをインターネット共有しましょう。
関連エントリ:
- (その1) - 概要とWiFi環境
- (その2) - DSとFlashをMIDIで繋げる
- (その3) - DSの勝手アプリを作るお
- (その4) - Serverの準備
- (その5) - Flashと連携
参考資料:
Fuse Kit : ショートカットプロパティ一覧
- Posted at: 2007年10月18日 14:31
- Update: 2007年12月10日 14:44
順番逆のような気もするけど。前回に続いて便利なショートカットプロパティも表にする。
あとで埋める。
ショートカットプロパティ
| _scale | 0 ~ | _xscaleと_yscaleを同時に指定。 |
| _size | 0 ~ | _widthと_heightを同時に指定。 |
| _frame | 0 ~ | ムービークリップのタイムラインの現在のフレームの値を指定/取得。 |
| _fade | 0 ~ 100 | 透明度の指定。 |
| _tint | 0xRRGGBB | カラーの指定。色の数値を返します。Number()を使って数値変換できます。 |
| _tintString | "0xRRGGBB" | カラーの指定。16進数文字列で返します。Number()を使って数値変換できます。 |
| _tintPercent | 0 ~ 100 | 事前に色変更されたターゲットの色のパーセンテージを指定/取得。 |
| _brightness | -100 ~ 100 | 明度の指定。-100(黒)/0(通常)/100(白) |
| _brightOffset | -100 ~ 100 | 焼き込み効果。-100(黒)/0(通常)/100(白) |
| _invertColor | 0 ~ 100 | ネガ効果。0(通常)/100(反転)。相対値できます。 |
| _colorReset | 0 ~ 100 | 色変化を、0(現状から変化なし)から、100(全てリセット)までの範囲でリセット。 |
| _contrast | 0 ~ 200 | コントラストの指定。0(グレー)/100(通常)/higher(200がコントラスト最大、higher にすると画像をポスタライズ)。相対値できます。 |
| _colorTransform | ra, rb プロパティ等の特定のカラートランスフォームオブジェクトの指定/取得。 |
参考資料:
- [Flash]
- コメント(0)
- トラックバック(0)
Fuse Kit : FuseFMPで使うBitmapFilterのプロパティ一覧
- Posted at: 2007年10月 6日 01:55
- Update: 2007年12月10日 14:45
Fuse kitで使うBitmapFilterにアクセスするための、ショートカットプロパティを表にまとめてみた。
ショートカットプロパティは、 フィルタ名 + _ + フィルタプロパティ名 というようなFuse Kit独自の命名規則でプロパティが用意されてます。他に_blur とかFuse Kitだけのプロパティも混じってるんで注意。
BlurFilter (ブラー)
| Blur_blurX | 0 ~ 255 | Xのぼかし量。2のべき乗は高速に最適化。(デフォルトは6)(浮動小数可) |
| Blur_blurY | 0 ~ 255 | Yのぼかし量。2のべき乗は高速に最適化。(デフォルトは6)(浮動小数可) |
| Blur_blur | 0 ~ 255 | XとYのぼかし量を同時に指定。 |
| Blur_quality | 0 ~ 15 | フィルタを適用する回数。1(LOW)/2(MEDIUM)/3(HIGH)(デフォルトは1) |
- [Flash]
- コメント(0)
- トラックバック(0)
Home > Flash Archive