goo

暗号 (Advapi32.dll)

暗号のメモ
単純なスクリプトなので詳細は省略。


/* --------------------------------------------------------------------------
	Crypt : Module
   -------------------------------------------------------------------------- */
#module Crypt
  #define global PROV_RSA_FULL		1
  #define global MS_ENHANCED_PROV	"Microsoft Enhanced Cryptographic Provider v1.0"
  #define global CALG_MD5		0x00008003
  #define global CALG_RC4		0x00006801

  #uselib "Advapi32.dll"
    #cfunc CryptAcquireContext	"CryptAcquireContextA"	var,int,str,int,int
    #func  CryptReleaseContext	"CryptReleaseContext"	int,int
    #cfunc CryptCreateHash	"CryptCreateHash"	int,int,int,int,var
    #cfunc CryptHashData	"CryptHashData"		int,var,int,int
    #func  CryptDestroyHash	"CryptDestroyHash"	int
    #cfunc CryptDeriveKey	"CryptDeriveKey"	int,int,int,int,var
    #func  CryptDestroyKey	"CryptDestroyKey"	int
    #cfunc CryptEncrypt		"CryptEncrypt"		int,int,int,int,var,var,int
    #cfunc CryptDecrypt		"CryptDecrypt"		int,int,int,int,var,var

  #uselib "Crypt32.dll" // Requires Windows Vista or Windows XP.
    #cfunc CryptBinaryToStringZ	"CryptBinaryToStringA"	var,int,int,int,var
    #cfunc CryptBinaryToString	"CryptBinaryToStringA"	var,int,int,var,var

  #deffunc CryptDestroy
    CryptDestroyKey hKey	: hKey  = 0
    CryptDestroyHash hHash	: hHash = 0
    CryptReleaseContext hProv,0	: hProv = 0
  return

  #defcfunc GetKey_ var pw,int pType,int hALG,int pALG,int keyGen
    if( (hProv != 0) || (hHash != 0) || (hKey != 0) ) : CryptDestroy
    if( CryptAcquireContext(hProv,0,MS_ENHANCED_PROV,pType,0) ){
      if( CryptCreateHash(hProv,hALG,0,0,hHash) ){
        if( CryptHashData(hHash,pw,strlen(pw),0) ){
          if( CryptDeriveKey(hProv,pALG,hHash,keyGen,hKey) ){
            return hKey
          }
        }
      }
    }
  return 0

  #defcfunc Encrypt_ int pType,int hALG,int pALG,var buf,var pw,int len,int keyGen
    ret = 0 : dwByte = len
    hKey = GetKey_(pw,pType,hALG,pALG,keyGen)
    if( hKey ){
      ret = CryptEncrypt(hKey,0,1,0,buf,dwByte,dwByte)
      if( ret ) : ret = dwByte
    }
    CryptDestroy
  return ret

  #defcfunc Decrypt_ int pType,int hALG,int pALG,var buf,var pw,int len,int keyGen
    ret = 0 : dwByte = len
    hKey = GetKey_(pw,pType,hALG,pALG,keyGen)
    if( hKey ){
      ret = CryptDecrypt(hKey,0,1,0,buf,dwByte)
      if( ret ) : ret = dwByte
    }
    CryptDestroy
  return ret

  #defcfunc GetKeys var pw
  return GetKey_(pw,PROV_RSA_FULL,CALG_MD5,CALG_RC4,0x800000)

  #defcfunc Encrypt var buf,var pw,int len
  return Encrypt_(PROV_RSA_FULL,CALG_MD5,CALG_RC4,buf,pw,len)

  #defcfunc Decrypt var buf,var pw,int len
  return Decrypt_(PROV_RSA_FULL,CALG_MD5,CALG_RC4,buf,pw,len)

  #defcfunc EncryptKey var buf,int key,int len
    dwByte = len
    if( CryptEncrypt(key,0,1,0,buf,dwByte,dwByte) ) : return dwByte
  return 0

  #defcfunc DecryptKey var buf,int key,int len
    dwByte = len
    if( CryptDecrypt(key,0,1,0,buf,dwByte) ) : return dwByte
  return 0

  #defcfunc GetBinToStr var pStr,var pBin,int len
    dwByte = 0
    if( CryptBinaryToStringZ(pBin,len,11,0,dwByte) ){
      sdim pStr,dwByte+1
      if( CryptBinaryToString(pBin,len,11,pStr,dwByte) ){
        return 1
      }
    }
  return 0
#global
/* --------------------------------------------------------------------------
	end of Crypt
   -------------------------------------------------------------------------- */

#define SCR0_X		500
#define SCR0_Y		500

*main
  sdim mb,10000 : sdim ip,260 : sdim btn,16,2
  bCrypt = 0 : bBin = 0
  screen 0,SCR0_X,SCR0_Y
  objmode 2 : font "MS ゴシック", 12
  objsize SCR0_X / 2,20
  btn(0)="暗号化","復号化"
  pos  0, 0 : button gosub btn(0), *crypt
  pos SCR0_X/2,0 : button gosub "表示変更", *bin
  pos 10,24 : mes "PASSWORD"
  pos 80,20 : input ip,SCR0_X - 80,20
  pos  0,40 : mesbox mb,SCR0_X,SCR0_Y-40
stop

*mbchg
  if(bBin){
    if(bCrypt == 0) : len = strlen(mb)
    if( GetBinToStr(s,mb,len) ) : objprm 3,s
  }
  else{
    objprm 3,mb
  }
return

*crypt
  if(bCrypt){
    ret = Decrypt(mb,ip,len)
    if(ret) : objprm 3,mb
  }
  else{
    len = strlen(mb)
    ret = Encrypt(mb,ip,len)
  }
  if( ret ){
    bCrypt ^= 1 : objprm 0,btn(bCrypt)
    gosub *mbchg
  }
return ret

*bin
  bBin ^= 1
  gosub *mbchg
return
コメント ( 9 ) | Trackback ( 0 )

MSDN VS 2008

【 2007/12/13 】MSDN Library for Visual Studio 2008 (2464.6 MB)
http://www.microsoft.com/downloads/details.aspx?
FamilyID=6FF3BC60-32C8-4C22-8591-A20BF8DFF1A2&displaylang=ja


上記から、ISOファイルをダウンロード。
winxpvirtualcdcontrolpanel_21でISOファイルを読込。
「setup.exe」を実行してインストール。

VS2003の場合
Visual Studio .NET 連結ヘルプ コレクション マネージャ
ms-help://MS.VSCC.2003/vscccommon/cm/CollectionManager.htm
から、「MSDN ライブラリ - Visual Studio 2008」を選択して、
VSCCの更新ボタンを押して、VS再起動。

VS2008EEの場合
既に、更新済みのようです。
ちなみに、Visual Studio 2008 連結ヘルプ コレクション マネージャは
ms-help://MS.VSCC.v90/dv_vscccommon/local/collectionmanager.htm

MSDN VS2008は、「VS2003」「VS2005」「VS2008」で使えるので
2008を入れた後は以前のヘルプは削除してもいいらしい(?)。

これで、VS2008で以前のヘルプがみれます。
コメント ( 0 ) | Trackback ( 0 )

Visual Studio 2008 Express Edition

Visual Studio 2008 Express Edition 日本語版 【2007/12/18】
http://www.microsoft.com/japan/msdn/vstudio/express/
上記サイトより引用
Visual Basic 2008 Express EditionWindows アプリケーションの楽しく簡単な作成方法に興味を持つ、趣味で開発を行うユーザー、プログラミング初心者、および学生に最適な開発ツールです。
Visual C# 2008 Express Editionダイナミックなアプリケーションを開発するための、シンプルで楽しく、学びやすい開発ツールです。
Visual C++ 2008 Express Editionよりパワフルで柔軟な開発環境を提供し、Windows ネイティブなアプリケーションやおよび 3D の2Dゲーム開発を支援します。
Visual Web Developer 2008 Express EditionVisual Basic や Visual C# を使って、ASP.NET の Web アプリケーションの開発や AJAX アプリケーションの開発を、簡単に楽しく行えます。

ダウンロードファイルは、上から「vbsetup.exe」「vcssetup.exe」「vcsetup.exe」「vnssetup.exe」。

インストール 1
ダウンロードしたファイルを実行する。ライセンス条項の同意、インストールする製品の選択、インストールフォルダの選択をするとダウンロードが始まる。
(vcsetup.exeの場合、全ての製品の選択で計543M)

Visual Studio 2008 Express Edition の DVD イメージからのインストール
http://www.microsoft.com/japan/msdn/vstudio/express/maninstall/2008/
ダウンロードファイルは、「VS2008ExpressJPNX1428694.iso」(1.09G)。

インストール 2
ダウンロードしたISOファイルをDVDに書き込み、「setup.hta」を実行してインストーラーを起動する。インストールしたいエディションを選択して、インストールを実行する。

インストール 3
仮想CDソフトウェアを使用して、ISOファイルを読み込む。
DAEMON Tools
http://www.daemon-tools.cc/dtcc/download.php

Download the Microsoft Virtual CD-ROM Control Panel package now.
http://download.microsoft.com/download/7/b/6/
7b6abd84-7841-4978-96f5-bd58df02efa2/winxpvirtualcdcontrolpanel_21.exe

「setup.hta」を実行してインストーラーを起動する。インストールしたいエディション(上記表の4種類)を選択して、インストールを実行する。


VB、C#は楽しく開発できるらしく、C++はそうではないようです。
と、それはさておきVS2008 C++のインストール開始。
最初、上記インストール1を実行したが、途中フリーズ(?)してしまいインストール3に変更。
winxpvirtualcdcontrolpanel_21.exeを使用してインストール完了。

楽しくプログラミングできるのもいいですが、本当に楽しくプログラミングができている人に。
広く浅くや、狭く深く等、色々方向性はあるかとおもいますが、
楽しいなら深く純粋に進んでいくといいかと思います。
良くも悪くもですが。例え問題があっても、方向修正は簡単なはずです。
できていない人は、できている人の真似をするのも一つの例だと思います。
真似から自己流を見出すのも悪くはありません。

さて、起動してみます。
あれ?スタートメニューを見ると「Visual C++ 9.0 Express Edition」の項目を発見。
気にせず、その中のVSEEのショートカットで起動。
最初の使用のために環境を構成中とのダイアログ。その後、まもなく2008起動。
とりあえず、ツールからオプションで自分用の設定に切り替え。各Viewの配置。
Win32 コンソール アプリケーションの作成と適当にコード書いて実行してみる。
当然追加のオプションで空のプロジェクトをチェック。
他、いじらないで、以下を実行。
#include <iostream>
void main()
{
	std::cout << "ハローワールド" << std::endl;
}

実行結果
ハローワールド

Debug : 39.424Byte
Release: 9.216Byte
別に、実行結果はどうでも良くて。ぼろPCの割りにはそれなりに動いてくれたのを確認。
VS2005と比べてもさほど変わらない印象。今後も、検証は続く...。

MSDNサブスクリプションから「Visual Studio 2008 Professional Edition」がダウンロードできます。
現在ダウンロードはできるが、インストールできない状況がある様です。
参考URL:VS2008をダウンロードしたがインストールできない
ダウンロードにかなりの時間が必要なので、様子待ちしたほうがいいのかもしれません。
コメント ( 0 ) | Trackback ( 0 )

Direct Music 4/4

「Direct Music」のメモ。
長いので分割しています。
DirectMusic のサンプル 2/2
DMusic Sample

サンプル イメージ図

// ここにDMusicモジュールを追加

/* --------------------------------------------------------------------------------------
	sample
   ------------------------------------------------------------------------------------- */
#module sample
#deffunc Mes2 str txt,int posx,int posy,¥
		int cR,int cG,int cB,¥
		int cbR,int cbG,int cbB,¥
		str fontname,int size,int s
	if(fontname!="") : font fontname,size
	if( s != 0 ){
		color cbR,cbG,cbB : pos posX+s,posY+s : mes txt
	}
	color cR ,cG ,cB  : pos posX,posY     : mes txt
return
#deffunc boxf2 int posx,int posy,int w,int h,¥
		int cR,int cG,int cB,¥
		int cbR,int cbG,int cbB,int s
	if( s != 0 ){
		color cbR,cbG,cbB
		boxf posX+s,posY+s,posX+w+s,posY+h+s
	}
	color cR ,cG ,cB
	boxf posX,posY,posX+w,posY+h
return
#global

#define ID_EVENT				0x9000
#define TITLE_NAME				"Sample"
#define FONT_NAME				"MS ゴシック"

#uselib "user32.dll"
#func  SetTimer		"SetTimer"		int,int,int,int
#func  KillTimer	"KillTimer"		int,int

// 初期化
*main
	screen 0, 480, 520 : hwnd0 = hwnd
	title TITLE_NAME : objmode 2

	dim sndInfo,3,8
	sdim txt,260
	sdim fileinfo,64,3
	sdim soundname,260,3
	ddim posSnd,7 : posSnd(0)= 5f,-0.5f,0f,0f,0.1f,0f,0f
	ddim posLsn,7 : posLsn(0)= 5f,-3.5f,0f,0f,0.1f,0f,0f
	MAX_X =  10f
	MIN_Z = -10f
	fileinfo(0)="プライマリファイル名: "
	fileinfo(1)="セカンダリファイル名: "
	fileinfo(2)="3Dサウンドファイル名: "
	boxf2 20,180,440,72,128,128,176,128,128,128,4
	txt = "モジュール変数初期化中…" 
	mes2 txt,40,200,128,128,255,64,64,64,FONT_NAME,32,2
	repeat 3 : newmod dm,DMusic : loop : wait 100

	boxf2 0,0,480,520,0,0,0,0,0,0,0
	txt = "3Dサウンド"
	boxf2 378,58,92,354,255,255,255,128,128,128,2
	mes2 txt,6,6,255,255,255,128,128,128,FONT_NAME,32,2
	txt = "左クリック:リスナーの移動 右クリック:音源の移動"
	mes2 txt,10,44,255,255,255,128,128,128,FONT_NAME,12,0
	txt = "プライマリ(∞)"
	mes2 txt,380,60,0,0,0,128,128,128,FONT_NAME,12,0
	txt = "セカンダリ(1)"
	mes2 txt,380,160,0,0,0,128,128,128,FONT_NAME,12,0
	txt = "3D(∞)"
	mes2 txt,380,260,0,0,0,128,128,128,FONT_NAME,12,0

	font FONT_NAME,12
	repeat 3
		objsize 90,25
		pos 380,cnt * 100 + 75  : button gosub "OPEN",*SndOpen
		objsize 44,25
		pos 380,cnt * 100 + 103 : button gosub "PLAY",*SndPlay
		pos 426,cnt * 100 + 103 : button gosub "STOP",*SndStop
		pos 380,cnt * 100 + 131 : button gosub "VOL -",*SndVolDown
		pos 426,cnt * 100 + 131 : button gosub "VOL +",*SndVolUp
	loop
	pos 380,359 : button gosub "SIZE -",*SizeDown
	pos 426,359 : button gosub "SIZE +",*SizeUp
	font FONT_NAME,10
	pos 380,387 : button gosub "LSNMOVE",*LSNMove
	pos 426,387 : button gosub "SNDMOVE",*SNDMove

	oncmd gosub *WMCLOSE,0x0010
	oncmd gosub *WMTIMER,0x0113
	oncmd gosub *WMLBUTTONDOWN,0x0201
	oncmd gosub *WMRBUTTONDOWN,0x0204
	SetTimer hwnd,ID_EVENT,500,0
stop

// 描画
*WMTIMER
	redraw 0
	font FONT_NAME,12
	boxf2 10,60,360,360,128,128,176,128,128,128,3
	if(posLsn(5) != 0f){
		x = 340f * posLsn(2) / MAX_X + 14f
		z = 340f * posLsn(3) / MIN_Z + 66f
		mes2 "○",x,z,255,64,64,128,0,0,"",12,1
		x = posLsn(2)-posLsn(0)
		z = posLsn(3)-posLsn(1)
		posLsn(6) = sqrt(x*x+z*z)
		if( posLsn(6) < posLsn(4)) : posLsn(5) = 0f
		if(posLsn(5)!=0f){
			r = atan(z,x)
			x = posLsn(4)*cos(r) : z = posLsn(4)*sin(r)
			DM_SetVelListener dm(2),x,0f,z,DS3D_DEFERRED
			posLsn(0) += x
			posLsn(1) += z
		}
		else{
			DM_SetVelListener dm(2),0f,0f,0f,DS3D_DEFERRED
			posLsn(0) = posLsn(2)
			posLsn(1) = posLsn(3)
		}
		DM_SetPosListener dm(2),posLsn(0),0f,posLsn(1),0
	}
	x = 340f * posLsn(0) / MAX_X + 14f
	z = 340f * posLsn(1) / MIN_Z + 66f
	mes2 "♀",x,z,255,64,64,128,0,0,"",12,1

	if(posSnd(5) != 0f){
		x = 340f * posSnd(2) / MAX_X + 14f
		z = 340f * posSnd(3) / MIN_Z + 66f
		mes2 "○",x,z,255,255,0,128,128,0,"",12,1
		x = posSnd(2)-posSnd(0)
		z = posSnd(3)-posSnd(1)
		posSnd(6) = sqrt(x*x+z*z)
		if( posSnd(6) < posSnd(4)) : posSnd(5) = 0f
		if(posSnd(5)!=0f){
			r = atan(z,x)
			x = posSnd(4)*cos(r) : z = posSnd(4)*sin(r)
			DM_SetVelSoundBuf dm(2),x,0f,z,DS3D_DEFERRED
			posSnd(0) += x
			posSnd(1) += z
		}
		else{
			DM_SetVelSoundBuf dm(2),0f,0f,0f,DS3D_DEFERRED
			posSnd(0) = posSnd(2)
			posSnd(1) = posSnd(3)
		}
		DM_SetPosSoundBuf dm(2),posSnd(0),0f,posSnd(1),0
	}
	x = 340f * posSnd(0) / MAX_X + 14f
	z = 340f * posSnd(1) / MIN_Z + 66f
	mes2 "♪",x,z,255,255,0,128,128,0,"",12,1

	boxf2 8,428,464,89,32,32,32,0,0,0,0
	boxf2 10,430,460,85,0,0,0,0,0,0,0
	font FONT_NAME,10
	foreach dm
		txt = fileinfo(cnt)
		if(soundname(cnt)==""){
			txt += "?"
		}
		else{
			txt += getpath(soundname(cnt),8)+"¥n  "
			ret = sndInfo(cnt,0) + 9600
			txt += "Vol:"+ret
			DM_GetSeek dm(cnt) : sndInfo(cnt,2) = stat
			txt += " Seek: "+sndInfo(cnt,2)+" / " + sndInfo(cnt,1)
		}
		mes2 txt,12,cnt*24+432,128,255,0,64,128,0,"",10,1
	loop
	txt = "Size:"+strf("%.0f",MAX_X)+"x"+strf("%.0f",MAX_X)
	mes2 txt,12,504,128,255,0,64,128,0,"",10,1
	txt = "Sound    "
	txt+= "MOVE:" + strf("%.2f",posSnd(4))
	txt+= " Pos:"+ strf("%.2f",posSnd(0))+","+strf("%.2f",-posSnd(1))
	if(posSnd(5)!=0f) : txt += "("+strf("%.2f",posSnd(6))+")"
	mes2 txt,200,492,255,255,0,128,128,0,"",10,1
	txt = "Listener "
	txt+= "MOVE:" + strf("%.2f",posLsn(4))
	txt+= " Pos:" + strf("%.2f",posLsn(0))+","+strf("%.2f",-posLsn(1))
	if(posLsn(5)!=0f) : txt += "("+strf("%.2f",posLsn(6))+")"
	mes2 txt,200,504,255,64,64,128,0,0,"",10,1
	redraw 1
return

// サウンドファイルを開く
*SndOpen
	id = stat / 5
	dialog "wav;*.mid",16,"サウンドファイル"
	if(stat != 1) : return
	txt = refstr
	mref stat_,64 : stat_ = id*5+2
	gosub *SndStop
	DM_LoadFromFile dm(id),txt
	if(stat){
		sndInfo(id,0) = 0
		sndInfo(id,2) = 0
		DM_GetLen dm(id) : sndInfo(id,1) = stat
		soundname(id) = txt
		posLsn(5) = 0f
		posSnd(5) = 0f
	else{
		soundname(id) = ""
		return
	}

	if(id == 2){
		DM_SetSoundDistance dm(2),1f,100f
		DM_SetListener dm(2),posLsn(0),0f,posLsn(1),0f,0f,0f,0f,0f,1f,0f,1f,0f,1f,1f
		DM_SetSoundBuf dm(2),posSnd(0),0f,posSnd(1),0f,0f,0f,360,360,0,0f,0f,-1f
	}
return

// サウンド再生
*SndPlay
	id = (stat - 1) / 5
	DM_IsPlay dm(id)
	if(stat){
		mref stat_,64 : stat_ = id*5+2
		gosub *SndStop
		ret = 0
	}
	else{
		ret = sndInfo(id,2)
	}

	if( id == 0 ){
		DM_Play dm(0),0,ret,sndInfo(id,0),DMUS_SEG_REPEAT_INFINITE
		return
	}
	if( id == 1 ){
		DM_Play dm(1),DMUS_SEGF_SECONDARY,ret,sndInfo(id,0),0
		return
	}
	if( id == 2 ){
		DM_Play dm(2),DMUS_SEGF_SECONDARY,ret,sndInfo(id,0),DMUS_SEG_REPEAT_INFINITE
		return
	}
return

// サウンド停止
*SndStop
	id = (stat - 2) / 5
	DM_StopSeg dm(id)
	DM_GetSeek dm(id)
	sndInfo(id,2) = stat
return

// 音量Down
*SndVolDown
	id = (stat - 3) / 5
	ret = sndInfo(id,0) - 100
	if(ret < -9600) : ret = -9600
	DM_SetAudioPathVol dm(id),ret
	if(stat) : sndInfo(id,0) = ret
return

// 音量Up
*SndVolUp
	id = (stat - 4) / 5
	ret = sndInfo(id,0) + 100
	if(ret > 0) : ret = 0
	DM_SetAudioPathVol dm(id),ret
	if(stat) : sndInfo(id,0) = ret
return

// 移動範囲Down
*SizeDown
	if(MAX_X < 11) : MAX_X -= 1f : else : MAX_X -= 10f
	if(MAX_X < 1f) : MAX_X = 1f
	MIN_Z = - MAX_X
	if(posLsn(0)>MAX_X || posLsn(1)<MIN_Z){
		posLsn(0) = MAX_X/2f
		posLsn(1) = MIN_Z
		DM_SetPosListener dm(2),posLsn(0),0f,posLsn(1),0
	}
	if(posSnd(0)>MAX_X || posSnd(1)<MIN_Z){
		posSnd(0) = MAX_X/2f
		posSnd(1) = 0f
		DM_SetPosSoundBuf dm(2),posSnd(0),0f,posSnd(1),0
	}
	if(posLsn(2)>MAX_X || posLsn(3)<MIN_Z){
		posLsn(2) = MAX_X
		posLsn(3) = MIN_Z
	}
	if(posSnd(2)>MAX_X || posSnd(3)<MIN_Z){
		posSnd(2) = MAX_X
		posSnd(3) = 0f
	}
return

// 移動範囲Up
*SizeUp
	if(MAX_X < 10f) : MAX_X += 1f : else : MAX_X += 10f
	MIN_Z = - MAX_X
return

// リスナー移動距離変更
*LSNMove
	if(posLsn(4)==MAX_X/4f):	posLsn(4)=MAX_X/2f:	return
	if(posLsn(4)==MAX_X/8f):	posLsn(4)=MAX_X/4f:	return
	if(posLsn(4)==MAX_X/16f):	posLsn(4)=MAX_X/8f:	return
	if(posLsn(4)==0.1f):		posLsn(4)=MAX_X/16f:	return
	posLsn(4) = 0.1f
return

// 音源移動距離変更
*SNDMove
	if(posSnd(4)==MAX_X/4f):	posSnd(4)=MAX_X/2f:	return
	if(posSnd(4)==MAX_X/8f):	posSnd(4)=MAX_X/4f:	return
	if(posSnd(4)==MAX_X/16f):	posSnd(4)=MAX_X/8f:	return
	if(posSnd(4)==0.1f):		posSnd(4)=MAX_X/16f:	return
	posSnd(4) = 0.1f
return

// クリック
*WMLBUTTONDOWN
*WMRBUTTONDOWN
	x = mousex : z = mousey
	if(x > 19 && x < 361 && z > 69 && z < 411){
		x = double(x - 20) * MAX_X / 340f 
		z = double(z - 70) * MIN_Z / 340f
		// 左クリック
		if(iparam == 0x0201){
			posLsn(2) = x
			posLsn(3) = z
			posLsn(5) = 1f
			return
		}
		// 右クリック
		if(iparam == 0x0204){
			posSnd(2) = x
			posSnd(3) = z
			posSnd(5) = 1f
			return
		}
	}
return

// 終了処理
*WMCLOSE
	KillTimer hwnd0,ID_EVENT
	foreach dm
		delmod dm.cnt
	loop
return
コメント ( 0 ) | Trackback ( 0 )

Direct Music 3/4

「Direct Music」のメモ。
長いので分割しています。
DirectMusic モジュール 2/2
#modfunc DM_SetListener double posX,double posY,double posZ,¥
				double velX,double velY,double velZ,¥
				double froX,double froY,double froZ,¥
				double topX,double topY,double topZ,¥
				double doppler,double rollOff

	dim ret : dim id,4 : dim id2,4
	dbl = doppler : id(0) = varptr(dbl) : id(1) = varptr(id2(0))
	ret = callfunc(id,varptr(dtof),2)
	DM_SetDopplerFactor pSListener,id2(0),DS3D_DEFERRED
	dbl = rollOff : id(0) = varptr(dbl) : id(1) = varptr(id2(0))
	ret = callfunc(id,varptr(dtof),2)
	DM_SetRolloffFactor pSListener,id2(0),DS3D_DEFERRED
	DM_SetPosListener thismod,posX,posY,posZ,DS3D_DEFERRED
	DM_SetVelListener thismod,velX,velY,velZ,DS3D_DEFERRED
	dbl = froX : id(0) = varptr(dbl) : id(1) = varptr(id(2))
	ret = callfunc(id,varptr(dtof),2)
	dbl = froY : id(0) = varptr(dbl) : id(1) = varptr(id(3))
	ret = callfunc(id,varptr(dtof),2)
	dbl = froZ : id(0) = varptr(dbl) : id(1) = varptr(id2(0))
	ret = callfunc(id,varptr(dtof),2)
	dbl = topX : id(0) = varptr(dbl) : id(1) = varptr(id2(1))
	ret = callfunc(id,varptr(dtof),2)
	dbl = topY : id(0) = varptr(dbl) : id(1) = varptr(id2(2))
	ret = callfunc(id,varptr(dtof),2)
	dbl = topZ : id(0) = varptr(dbl) : id(1) = varptr(id2(3))
	ret = callfunc(id,varptr(dtof),2)
	DM_SetOrientation pSListener,id(2),id(3),id2(0),id2(1),id2(2),id2(3),DS3D_DEFERRED
	DM_CommitDeferredSettings pSListener
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_GetPosSoundBuf array d3vec
	dim ret : dim id,4 : dim id2,4
	ddim d3vec,3
	DM_GetPosition pSBuffer,id
	id2(0) = varptr(id(0)) : id2(1) = varptr(d3vec(0))
	ret = callfunc(id2,varptr(ftod),2)
	id2(0) = varptr(id(1)) : id2(1) = varptr(d3vec(1))
	ret = callfunc(id2,varptr(ftod),2)
	id2(0) = varptr(id(2)) : id2(1) = varptr(d3vec(2))
	ret = callfunc(id2,varptr(ftod),2)
return

#modfunc DM_GetVelSoundBuf array d3vec
	dim ret : dim id,4 : dim id2,4
	ddim d3vec,3
	DM_GetVelocity pSBuffer,id
	id2(0) = varptr(id(0)) : id2(1) = varptr(d3vec(0))
	ret = callfunc(id2,varptr(ftod),2)
	id2(0) = varptr(id(1)) : id2(1) = varptr(d3vec(1))
	ret = callfunc(id2,varptr(ftod),2)
	id2(0) = varptr(id(2)) : id2(1) = varptr(d3vec(2))
	ret = callfunc(id2,varptr(ftod),2)
return

#modfunc DM_SetPosSoundBuf double posX,double posY,double posZ,int b
	dim ret : dim id,4 : dim id2,4
	dbl = posX : id(0) = varptr(dbl) : id(1) = varptr(id2(0))
	ret = callfunc(id,varptr(dtof),2)
	dbl = posY : id(0) = varptr(dbl) : id(1) = varptr(id2(1))
	ret = callfunc(id,varptr(dtof),2)
	dbl = posZ : id(0) = varptr(dbl) : id(1) = varptr(id2(2))
	ret = callfunc(id,varptr(dtof),2)
	DM_SetPosition pSBuffer,id2(0),id2(1),id2(2),b
return

#modfunc DM_SetVelSoundBuf double velX,double velY,double velZ,int b
	dim ret : dim id,4 : dim id2,4
	dbl = velX : id(0) = varptr(dbl) : id(1) = varptr(id2(0))
	ret = callfunc(id,varptr(dtof),2)
	dbl = velY : id(0) = varptr(dbl) : id(1) = varptr(id2(1))
	ret = callfunc(id,varptr(dtof),2)
	dbl = velZ : id(0) = varptr(dbl) : id(1) = varptr(id2(2))
	ret = callfunc(id,varptr(dtof),2)
	DM_SetVelocity pSBuffer,id2(0),id2(1),id2(2),DS3D_DEFERRED
return

#modfunc DM_SetSoundBuf double posX,double posY,double posZ,¥
		double velX,double velY,double velZ,¥
		int coneIn, int coneOut,int coneVolOut,¥
		double coneInX,double coneInY,double coneInZ
	dim ret : dim id,4 : dim id2,4
	DM_SetPosSoundBuf thismod,posX,posY,posZ,DS3D_DEFERRED
	DM_SetVelSoundBuf thismod,velX,velY,velZ,DS3D_DEFERRED
	DM_SetConeAngles pSBuffer,conIn,coneOut,DS3D_DEFERRED
	DM_SetConeOutsideVolume pSBuffer,coneVolOut,DS3D_DEFERRED
	dbl = coneInX : id(0) = varptr(dbl) : id(1) = varptr(id2(0))
	ret = callfunc(id,varptr(dtof),2)
	dbl = coneInY : id(0) = varptr(dbl) : id(1) = varptr(id2(1))
	ret = callfunc(id,varptr(dtof),2)
	dbl = coneInZ : id(0) = varptr(dbl) : id(1) = varptr(id2(2))
	ret = callfunc(id,varptr(dtof),2)
	DM_SetConeOrientation pSBuffer,id2(0),id2(1),id2(2),DS3D_DEFERRED
	DM_CommitDeferredSettings pSListener
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_SetDir str dir
	dim ret : dim id,4
	UuidFromString GUID_DirectMusicAllTypes_, id
	DM_SetSearchDirectory pLoader, id, dir, 0
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_SetStartPos int startPos
	dim ret
	DM_SetStartPoint pSeg,startPos
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_GetStartPos
	dim ret
	DM_GetStartPoint pSeg,ret
return ret

#modfunc DM_GetLen
	dim ret
	DM_GetLength pSeg,ret
return ret

#modfunc DM_GetSeek
	dim ret
	DM_GetSeek_ pSegSt,ret
return ret

#modfunc DM_IsPlay
	dim ret
	DM_IsPlaying pPfm,pSeg,0
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_GetMasterVol
	dim id,4 : dim ret
	UuidFromString GUID_PerfMasterVolume_,id
	DM_GetGlobalParam pPfm,id,ret,4
	if( stat != 0 ) : ret = 0
return ret

#modfunc DM_SetMasterVol int vol
	dim id,4 : dim ret
	ret = vol
	UuidFromString GUID_PerfMasterVolume_,id
	DM_SetGlobalParam pPfm,id,ret,4
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_SetAudioPathVol int vol
	DM_SetVolume pAPath,vol,0
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_SetSegRepeat int repeats
	DM_SetRepeats pSeg,repeats
return 1

#modfunc DM_GetTempo
	dim ret : dim id,4 : dim id2,4
	dbl = 1.0
	UuidFromString GUID_PerfMasterTempo_,id
	DM_GetGlobalParam pPfm,id,ret,4
	if( stat != 0 ) : return dbl
	id2(0) = varptr(ret) : id2(1) = varptr(dbl)
	ret = callfunc(id2,varptr(ftod),2)
return dbl // refdval

#modfunc DM_SetTempo double tempo
	dim ret : dim id,4 : dim id2,4
	dbl = tempo
	id2(0) = varptr(dbl) : id2(1) = varptr(id2(2))
	ret = callfunc(id2,varptr(dtof),2)
	UuidFromString GUID_PerfMasterTempo_,id
	DM_SetGlobalParam pPfm,id,id2(2),4
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_LoadFromFile str filename
	dim ret : dim id,4 : dim id2,4 : sdim strTmp,260
	exist filename : if( strsize == -1 ) : return 0
	UuidFromString CLSID_DirectMusicSegment_, id
	UuidFromString IID_IDirectMusicSegment8_, id2
	DM_LoadObjectFromFile pLoader, id, id2, filename, ret
	if( ret == 0 ) : return 0
	newcom pSeg, IDirectMusicSegment8, -1, ret
	strTmp = getpath(filename,2 + 16)
	if( strTmp == ".mid" ){
		UuidFromString GUID_StandardMIDIFile_, id
		DM_SetParam pSeg,id,-1,0,0,0
	}
	DM_Download pSeg,pPfm
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_LoadFromBuf var mem,int size,int bMidi
	dim ret : dim id,4 : dim id2,4
	dim objdesc,212
	UuidFromString CLSID_DirectMusicSegment_, id
	UuidFromString IID_IDirectMusicSegment8_, id2
	objdesc(0) = 848
	objdesc(1) = DMUS_OBJ_CLASS | DMUS_OBJ_MEMORY
	objdesc(210) = varptr(mem) : objdesc(209) = size
	memcpy objdesc,id,16,24,0
	DM_GetObject pLoader,objdesc,id2,ret
	if( ret == 0 ) : return 0
	newcom pSeg, IDirectMusicSegment8, -1, ret
	if( bMidi ){
		UuidFromString GUID_StandardMIDIFile_, id
		DM_SetParam pSeg,id,-1,0,0,0
	}
	DM_Download pSeg,pPfm
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_Play int typeSeg,int startPos,int vol,int repeats
	dim ret
	DM_SetStartPos thismod,startPos
	DM_SetAudioPathVol thismod,vol
	DM_SetSegRepeat thismod,repeats
	ret = typeSeg | DMUS_SEGF_BEAT
	if(typeSeg & DMUS_SEGF_SECONDARY) : ret |= DMUS_SEGF_CONTROL
	DM_PlaySegmentEx pPfm,pSeg,0,0,ret,0,0,ret,0,pAPath
	newcom pSegSt,IDirectMusicSegmentState8,-1,ret
return stat

#modfunc DM_LoadFromPackFile str filename
	dim ret : sdim strTmp,260
	exist filename : if( strsize == -1 ) : return 0
	sdim buf,strsize
	strTmp = getpath(filename,2 + 16)
	if( strTmp == ".mid" ) : ret = 1 : else : ret = 0
	bload filename,buf
	DM_LoadFromBuf thismod,buf,strsize,ret
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_PlayFromFile str filename,¥
		int typeSeg,int startPos, int vol,int repeats
	dim ret
	DM_LoadFromFile thismod,filename
	if( stat == 0 ) : return 0
	DM_Play thismod,typeSeg,startPos,vol,repeats
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_PlayFromPackFile str filename,¥
		int typeSeg,int startPos, int vol,int repeats
	dim ret
	DM_LoadFromPackFile thismod,filename
	if( stat == 0 ) : return 0
	DM_Play thismod,typeSeg,startPos,vol,repeats
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_StopSeg
	dim ret
	DM_StopEx pPfm,pSeg,0,0,0
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modfunc DM_StopAll
	dim ret
	DM_Stop_ pPfm,0,0,0,0
	if( stat == 0 ) : ret = 1 : else : ret = 0
return ret

#modterm
	DM_StopSeg thismod
	DM_Unload pSeg,pPfm
	delcom pSegSt : delcom pSeg : delcom pLoader
	delcom pAPath : delcom pPfm
return

#global
/* --------------------------------------------------------------------------------------
	End of DMusic
   ------------------------------------------------------------------------------------- */

DMusicモジュールはここまで
DirectMusic のサンプル 1/2
サンプルでのプライマリは、すぐに切り替えています。
また、セカンダリは、一回再生です。3Dサウンドは、セカンダリで無限リピートで再生しています。
左上に表示している「♪」は3Dサウンドの音源、「♀」はリスナーです。
「♪」は常に、真南に再生しています。「♀」は常に、北向き、直立して聞いている状態です。
左上の青色部分をクリックすることで、移動可能です。ボタンのSIZEで移動範囲、LSNMOVEでリスナーの移動距離、SNDMOVEで音源の移動距離を変更可能(m単位)。

Direct Music 4/4に続く。
コメント ( 0 ) | Trackback ( 0 )
« 前ページ