約 6,125,541 件
https://w.atwiki.jp/opengl/pages/86.html
では、取りあえず簡単な読み込みプログラムを作ってみます。 今回はテクスチャ無しで、マテリアルも読み込んでいませんが .MQO の読み込みプログラムの時とは違って法線情報が ありますので陰影が表現されています。 box.obj # Created by Metasequoia mtllib box.mtl v -100.000000 100.000000 100.000000 v -100.000000 -100.000000 100.000000 v 100.000000 100.000000 100.000000 v 100.000000 -100.000000 100.000000 v 100.000000 100.000000 -100.000000 v 100.000000 -100.000000 -100.000000 v -100.000000 100.000000 -100.000000 v -100.000000 -100.000000 -100.000000 # 8 vertices vt 0.00000 0.00000 vt 1.00000 0.00000 vt 1.00000 1.00000 vt 0.00000 1.00000 # 4 texture vertices vn 0.00000 0.00000 1.00000 vn 1.00000 0.00000 0.00000 vn 0.00000 0.00000 -1.00000 vn -1.00000 0.00000 0.00000 vn 0.00000 1.00000 0.00000 vn 0.00000 -1.00000 0.00000 # 6 normal vertices usemtl default f 2/4/1 4/3/1 3/2/1 1/1/1 f 4/4/2 6/3/2 5/2/2 3/1/2 f 6/4/3 8/3/3 7/2/3 5/1/3 f 8/4/4 2/3/4 1/2/4 7/1/4 f 1/4/5 3/3/5 5/2/5 7/1/5 f 8/4/6 6/3/6 4/2/6 2/1/6 # 6 elements box.mtl # Created by Metasequoia newmtl default Ka 0.60000 0.60000 0.60000 Kd 0.80000 0.80000 0.80000 Ks 0.00000 0.00000 0.00000 Ns 5.00000 OBJ.h #include vector using namespace std; //3つのベクトル struct Vector3f{ float x; float y; float z; }vec3d; //4つのベクトル struct Vector4f{ float x; float y; float z; float w; }vec4d; //4つの反射 struct Reflection4{ float diffuse; float ambient; float emission; float specular; }; //4つのカラー struct Color4{ float r; float g; float b; float a; }; //UV座標 struct UV{ float u;//u値 float v;//v値 }vec2d; struct Vector4I{ int x; int y; int z; int w; }; //ポリゴンデータ struct Triangle{ Vector3f TriVer; Vector3f TriNor; UV TriUV; }Tri; //ポリゴンデータ struct Quadrangle{ Vector3f QuadVer; Vector3f QuadNor; UV QuadUV; }Quad; //マテリアル構造体 struct MATERIAL{ int MaterialID;//ID string MaterialName;//マテリアル名 Color4 Color;//カラー Reflection4 ReflectionColor;//反射 float Power;//shiness string TextureName;//テクスチャ名 }mtl; //モデルクラス class MODEL{ protected bool LoadMaterialFromFile(char* FileName);//マテリアルロード vector Triangle Tridata; vector Quadrangle Quaddata; public MODEL(); MODEL(char* FileName);//コンストラクタ bool OBJ_Load(char* FileName);//ロード void Draw(); }; MODEL MODEL(){ } MODEL MODEL(char* FileName){ OBJ_Load(FileName); } void MODEL Draw(){ glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); if(Tridata.size() 1){ glVertexPointer(3, GL_FLOAT,sizeof(Tri) , Tridata[0].TriVer.x); glNormalPointer(GL_FLOAT,sizeof(Tri), Tridata[0].TriNor.x); glDrawArrays(GL_TRIANGLES,0,Tridata.size()); } if(Quaddata.size() 1){ glVertexPointer(3, GL_FLOAT,sizeof(Quad) , Quaddata[0].QuadVer.x); glNormalPointer(GL_FLOAT,sizeof(Quad), Quaddata[0].QuadNor.x); glDrawArrays(GL_QUADS,0,Quaddata.size()); } glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); } //OBJファイル読み込み bool MODEL OBJ_Load(char* FileName){ Vector4I Face[3];//一時代入用 vector Vector3f Vertex;//頂点 vector Vector3f Normal;//法線 vector UV uv;//UV vector unsigned int TriVerID; vector unsigned int TriNorID; vector unsigned int TriUVID; vector unsigned int QuadVerID; vector unsigned int QuadNorID; vector unsigned int QuadUVID; char key[255]={0}; //OBJファイルを開いて内容を読み込む FILE* fp=NULL; fopen_s( fp,FileName, rt ); //読み込み fseek(fp,SEEK_SET,0); while(!feof(fp)) { //キーワード ZeroMemory(key,sizeof(key)); fscanf_s(fp, %s ,key,sizeof(key)); //マテリアル if(strcmp(key, mtllib )==0){ fscanf_s(fp, %s ,key,sizeof(key)); LoadMaterialFromFile(key); } //頂点 if(strcmp(key, v )==0){ fscanf_s(fp, %f %f %f , vec3d.x, vec3d.y, vec3d.z); Vertex.push_back(vec3d); } //法線 if(strcmp(key, vn )==0){ fscanf_s(fp, %f %f %f , vec3d.x, vec3d.y, vec3d.z); Normal.push_back(vec3d); } //テクスチャ if(strcmp(key, vt )==0){ fscanf_s(fp, %f %f , vec2d.u, vec2d.v); uv.push_back(vec2d); } //面のインデックス 0=頂点 1=UV 2=法線 if(strcmp(key, f )==0){ Face[0].w=-1; Face[1].w=-1; Face[2].w=-1; fscanf_s(fp, %d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d , Face[0].x, Face[1].x, Face[2].x, Face[0].y, Face[1].y, Face[2].y, Face[0].z, Face[1].z, Face[2].z, Face[0].w, Face[1].w, Face[2].w); if((Face[0].w == -1) (Face[1].w == -1) (Face[2].w == -1)){ //三角面 TriVerID.push_back(Face[0].x-1); TriVerID.push_back(Face[0].y-1); TriVerID.push_back(Face[0].z-1); TriUVID.push_back(Face[1].x-1); TriUVID.push_back(Face[1].y-1); TriUVID.push_back(Face[1].z-1); TriNorID.push_back(Face[2].x-1); TriNorID.push_back(Face[2].y-1); TriNorID.push_back(Face[2].z-1); }else{ //四角面 QuadVerID.push_back(Face[0].x-1); QuadVerID.push_back(Face[0].y-1); QuadVerID.push_back(Face[0].z-1); QuadVerID.push_back(Face[0].w-1); QuadUVID.push_back(Face[1].x-1); QuadUVID.push_back(Face[1].y-1); QuadUVID.push_back(Face[1].z-1); QuadUVID.push_back(Face[1].w-1); QuadNorID.push_back(Face[2].x-1); QuadNorID.push_back(Face[2].y-1); QuadNorID.push_back(Face[2].z-1); QuadNorID.push_back(Face[2].w-1); } } } for(int i=0;i (signed)TriVerID.size();i++){ Tri.TriVer=Vertex[TriVerID[i]]; Tri.TriNor=Normal[TriNorID[i]]; Tri.TriUV=uv[TriUVID[i]]; Tridata.push_back(Tri); } printf( %d ,Tridata.size()); for(int i=0;i (signed)QuadVerID.size();i++){ Quad.QuadVer=Vertex[QuadVerID[i]]; Quad.QuadNor=Normal[QuadNorID[i]]; Quad.QuadUV=uv[QuadUVID[i]]; Quaddata.push_back(Quad); } Vertex.clear(); Normal.clear(); uv.clear(); TriVerID.clear(); TriNorID.clear(); TriUVID.clear(); QuadVerID.clear(); QuadNorID.clear(); QuadUVID.clear(); return true; } bool MODEL LoadMaterialFromFile(char *FileName){ return true; } main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, glew32.lib ) #include gl/glew.h #include GL/freeglut/freeglut.h #include OBJ.h #define WIDTH 320 #define HEIGHT 240 float angle=0.0f; MODEL* model; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0,0,WIDTH,HEIGHT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, WIDTH/HEIGHT, 0.1, 2000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 1500.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glRotatef(angle,1.0f,0.0f,0.0f);//回転 glRotatef(angle,0.0f,1.0f,0.0f);//回転 model- Draw(); glutSwapBuffers(); } void idle(void) { angle+=2.0f; Sleep(1); glutPostRedisplay(); } void Init(){ glewInit(); glClearColor(0.0, 0.0, 0.0, 1.0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); model = new MODEL( box.obj ); } int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( OBJローダ ); glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return 0; }
https://w.atwiki.jp/libutau/pages/20.html
一般的なビルド方法 C++ Builder XE3 でのビルド方法C++ Builder XE についての補足 Visual C++ 2013 Express でのビルド方法 実行 一般的なビルド方法 サンプルプログラムをビルドするには、以下のファイル群をプロジェクトに追加してビルドして下さい。 サンプルプログラムのソースコード(Sample.cpp) Lib UTAU の全てのファイル Shlwapi.lib(Windows 7 の場合、C \Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib\ にあります) C++ Builder XE3 でのビルド方法 同梱のプロジェクトファイル「LibUTAUSample.cbproj」を利用すると少し楽かもしれません。 プロジェクトオプションの「最終出力ディレクトリ」など、フォルダ関連のオプションは適宜変更して下さい。 サンプルプログラムのビルド中に、 [ILINK32 エラー] Error 未解決の外部シンボル _wmain が C0X32W.OBJ から参照されています というようなエラーが発生した場合は、プロジェクトオプションの「ディレクトリと条件定義」で、_TCHAR のマップ先を char にして下さい。 C++ Builder XE についての補足 #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (around) C++ Builder XE は、Windows 用アプリケーションをビジュアルに開発できる RAD 環境です。Visual Basic の C++ 版というとイメージが近いかもしれません。 フォームに様々なコンポーネントを貼り付け、プロパティを設定することで、簡単に GUI を設計できます。 最近ようやく、Visual C++ も(名前通り)ビジュアルに近づいてきましたが、C++ Builder シリーズは十数年も昔からビジュアル開発環境を提供してきています。単にビジュアルに設計できると言うだけではなく、コードエディタとの連動性も高く、練り込まれていると感じます。 例えば、VC++ ですと、フォームアプリケーションにした途端に名前空間がてんこ盛りになったり、コードエディタで変更してはいけないルールのコードがたくさん生成されたりします。イベントハンドラをソースファイルではなくヘッダファイルに記述するのも違和感があります。コンポーネントの名前を変更しても、イベントハンドラの名前に反映されません。 しかし C++ Builder であれば、VC++ と比較して、ビジュアル開発が通常の C++ 開発スタイルに自然に溶け込んでいますし、GUI デザイナ上の変更もただちにソースコードに反映されます。コンポーネントも Windows 標準のコントロールに加えていろいろなものが用意されており、手早く GUI を設計できます。 特に趣味プログラムであれば、C++ Builder は手軽な開発ツールとして良いのではないでしょうか。Starter 版(通常はこれで十分な機能があります)であれば、価格も 1 万円台と安価です。無償ではありませんが、得られる開発の手軽さを考えれば、試してみる価値は十分にあると思います。 ただ、アップデータのインストーラの挙動がイマイチだったり(標準ユーザー→Administrator 権限に昇格できないなど)、メニューバーにアクセラレータキーが表示されなかったり(開発するアプリのことではなく C++ Builder 自体)、Windows アプリケーションとしての振る舞いに難があるので、その辺りは改善を望みたいところです。 製品名 C++ Builder XE 発売元 Embarcadero(エンバカデロ) Twitter Embarcadero Japan 購入先の例 C++Builder XE Starter ダウンロード版(翔泳社オンラインショップ) Visual C++ 2013 Express でのビルド方法 同梱のプロジェクトファイル「LibUTAUSample.sln」を利用すると少し楽かもしれません。 プロジェクトプロパティページの[構成プロパティ|全般|出力ディレクトリ]など、フォルダ関連のオプションは適宜変更して下さい。 なお、旧バージョンの VC++ 2010 をお使いの場合、テンポラリフォルダがルートフォルダだとビルドできないというバグがあるので注意して下さい。「System.TypeInitializationException Microsoft.Build.Utilities.FileTracker のタイプ初期化子が例外をスローしました。」というエラーになります。 実行 ビルドしてできあがった exe ファイルを「LibUTAUSample.exe」にリネームして、同梱の plugin.txt と一緒に UTAU の plugins フォルダ配下に配置すれば、UTAU プラグインとして使えます。 既にビルド済みの LibUTAUSample.exe も同梱してありますので、こちらをお使いいただいても構いません。
https://w.atwiki.jp/bokuyo/pages/188.html
zlib 1.2.7 を Visual Studio 2012 Express でビルドする zlib 1.2.7(May 2, 2012) を Windows 7 環境にて導入します。 Visual Studio 2012 Express for Windows Desktop を使用しています。実行したのは 32bit(x86) 環境です。適宜、お使いの環境に合わせて読み進めてください Visual C++ 2012 コンパイラを使いますVisual C++ 2012 コンパイラより以前の VC++ 10 環境(Visual Studio 2010)および VC++ 11 Beta コンパイラ(Visual Studio 2012 RC) と混同しないよう注意してください。 zlib 1.2.7 を Visual Studio 2012 RC でビルドする - VC++ 11 Beta コンパイラ(Visual Studio 2012 RC) zlib 1.2.6 をVisual C++でビルドする - Visual Studio 2010 (VC++ 10) ダウンロード http //zlib.net/(公式サイト)から「zlib source code, version 1.2.7, zipfile format」をダウンロードします。 ダウンロードした"zlib127.zip" ファイルを解凍します。以降の説明では、面倒なので解凍先を C ドライブにしています Visual Studio 2012 用のソリューション・プロジェクトファイルを作る "zlib-1.2.7/contrib/vstudio/vc10/" フォルダをコピーして、新たに作業用の "zlib-1.2.7/contrib/vstudio/vc11/" フォルダを作ります。 "zlib-1.2.7/contrib/vstudio/vc11/zlibvc.sln" をVisual Studio 2012 Express で開きます 次のポップアップウィンドウが出たら「更新する(U)」を選択してください VC++ コンパイラとライブラリを更新します このソリューションには、以前のバージョンの VC++ コンパイラとライブラリを使用するプロ ジェクトが 1 つ以上含まれています。各プロジェクトを Visual C++ 2012 コン パイラとライブラリを使用するように更新できます。 これで Visual C++ 2012 コンパイラを使用できます。 Visual Studio 2012 Express でビルドする そのままビルド(F7)してください。 ビルド時のエラー (1) - def ファイルで LNK1118 1 .\zlibvc.def(4) fatal error LNK1118 VERSION ステートメントに構文エラーがあります。 解決策 "zlib-1.2.7/contrib/vstudio/vc11/zlibvc.def" を開くと 4 行目が次のようになっている VERSION1.2.7 VERSION がとる引数は major[.minor] なのでこれを次のように修正 VERSION1.27 //ok MSDN - VERSION (C/C++) ビルド時のエラー (2) - SAFESEH イメージには安全ではありません 2 match686.obj error LNK2026 モジュールは SAFESEH イメージには安全ではありません。 2 inffas32.obj error LNK2026 モジュールは SAFESEH イメージには安全ではありません。 2 adler32.obj warning LNK4075 /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 2 x86\TestZlibDebug\testzlib.exe fatal error LNK1281 SAFESEH イメージを生成できません。 1 match686.obj error LNK2026 モジュールは SAFESEH イメージには安全ではありません。 1 inffas32.obj error LNK2026 モジュールは SAFESEH イメージには安全ではありません。 1 adler32.obj warning LNK4075 /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 1 x86\ZlibDllDebug\zlibwapi.dll fatal error LNK1281 SAFESEH イメージを生成できません。 3 testzlib.obj warning LNK4075 /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 4 minizip.obj warning LNK4075 /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 5 miniunz.obj warning LNK4075 /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 解決策 - /SAFESEH を特に指定しないようにする(/SAFESEH NO にするわけではない) zlib 1.2.7 の Visual Studio 2010 用のソリューションファイル (.sln) を Visual Studio 2012 Express 用に変更すると、リンカーオプションに /SAFESEH が勝手に追加されますVisual Studio 2010 用のソリューション・プロジェクトファイルを見る限り、/SAFESEH オプションは何も指定されていません リンカ―の詳細設定から /SAFESEH に関する指定を外してあげますソリューションエクスプローラから "zlibvc" プロジェクトを選択 プロジェクト - プロパティ - 構成プロパティ - リンカ― - 詳細設定 - "安全な例外ハンドラーを含むイメージ" 「はい (/SAFESEH)」または「いいえ (/SAFESEH NO)」が指定されている場合、項目を削除して何も指定しないようにします。(backspace キーか delete キーで指定されている文字「はい (/SAFESEH)」または「いいえ (/SAFESEH NO)」を消しちゃってください) zlibvc プロジェクトと同様に、miniunz, minizip, testzlib, testzlibdll プロジェクトの /SAFESEH に関する指定を外します "ビルド" - "ソリューションのクリーン" でソリューション全体を一度クリーンします ビルドします Release(または Debug)でビルドするときに /SAFESEH に関する指定を外すのを忘れないように。 実際に使ってみる スタティックライブラリのリンク: #if ( _MSC_VER = 1700 ) #if defined( _DEBUG ) #pragma comment(lib, "ZlibStatDebug/zlibstat.lib") #else #pragma comment(lib, "ZlibStatRelease/zlibstat.lib") #endif #endif zlib の呼び出し規約を ZLIB_WINAPI に設定して zlib.h をインクルード: #ifndef ZLIB_WINAPI #define ZLIB_WINAPI #endif #include zlib/zlib.h ZLIB_WINAPI を設定するかどうかは zlib を使用するアプリケーションごとに適切な呼び出し規約を指定してください。 今回のビルド方法では、zlib は MTd/MT でビルドされているので、MDd/MD のアプリケーションで使用すると、CRT ライブラリが競合を起こします。大抵の場合は、アプリケーションのほうを MTd/MT に合わせればおっけーです。 参考文献 MSDN - リンカー オプション (Visual Studio 2012)
https://w.atwiki.jp/libutau/pages/19.html
サンプルプログラムの解説 まずは TUtauData [#SETTING] セクションの管理 音符セクションの管理 パイプファイルのバージョン間の相違を吸収 値の設定 パイプファイルへの書き戻し 追記予定 サンプルプログラムの解説 Lib UTAU に同梱してあるサンプルプログラムについて、その内容を解説します。 なお、ここで引用しているのはダイジェスト版であり、一部のプログラムコードが省略されています。 まずは TUtauData int main(int oArgC, char* oArgV[]){ // パイプファイルの内容全体を管理するクラス TUtauData aUtauData; // パイプファイルの内容を読み込む if ( aUtauData.SetTo(oArgV[1]) != B_OK ) { echo("パイプファイルを読み込めません。"); return -1; } Lib UTAU の中心となるクラスは TUtauData であり、UTAU 本体から受け取るパイプファイルの内容をすべて管理するクラスです。 Lib UTAU を利用する場合、まずは TUtauData のインスタンスを生成するところから始めます(4 行目)。 続いて、SetTo() 関数でパイプファイルの内容をすべて読み込みます(7 行目)。UTAU 本体からプラグインへ、パイプファイル名がコマンドライン引数として渡されますので、そのファイル名を SetTo() 関数に渡します。 Lib UTAU 全体を通じて言えることですが、文字列は全て、マルチバイト文字(char)です。ワイド文字(wchar_t)ではありません。ファイル名もマルチバイト文字で渡して下さい。 SetTo() 関数は正常にパイプファイルを読み込めると、定数 B_OK を返してくるので、B_OK 以外が返ってきた場合はエラーとしてプログラムを終了します。 [#SETTING] セクションの管理 // [#SETTING] セクションの内容を管理するクラス const TUtauSectionSettings* aSettings; aSettings = aUtauData.SectionSettings(); // [#SETTING] セクションからテンポ(double 型)を取得してみる double aTempo; if ( aSettings- GetValue(KEY_NAME_TEMPO, aTempo) == B_OK ) { echo("テンポを取得できました:"+num_to_string(aTempo)); } else { echo("テンポが設定されていません。"); } 最初に、パイプファイルの [#SETTING] セクションの情報を取得してみましょう。 [#SETTING] セクションを管理するクラスは TUtauSectionSettings です。TUtauData SectionSettings() 関数で、TUtauSectionSettings へのポインタを取得できます(3 行目)。 [#SETTING] セクションはリードオンリーなので、TUtauSectionSettings のポインタ変数を宣言する際は const 付きにしておいて下さい。 [#SETTING] セクションに記録されている情報を取得するには、GetValue() 関数を使います(7 行目)。 GetValue() の第 1 引数は、取得したい情報の名称です。テンポを取得する時は KEY_NAME_TEMPO を渡します。KEY_NAME_TEMPO は Lib UTAU で定義されている定数で、実体は "Tempo" です。パイプファイルの中身は「Tempo=120.00」などとなっていますが、ここの名称をそのまま渡せば情報を取得できるということです。 GetValue() の第 2 引数は、取得した値の格納場所です。テンポは小数なので、double 型変数へのポインタを渡すことで、この変数にテンポが格納されます。 8 行目では、取得したテンポを表示しています。echo() 関数は Lib UTAU の関数ではなく、サンプルプログラムで定義している関数です。通常なら cout で良いのですが、ライブラリ作者の環境ですと、cout だと UTAU から起動された場合に値が表示されなかったので、echo() 関数内でメッセージボックスを表示しています。 num_to_string() 関数は Lib UTAU のサポート関数で、数値を文字列(string 型)に変換します。boost が使える環境でしたら、lexical_cast string 使えばいいだけなのですけどね。 音符セクションの管理 // 音符セクション([#0001] など)の内容を管理するクラス TUtauSectionNote* aNote; // UTAU で選択されている音符の歌詞(string 型)をすべて取得してみる string aLyric; string aAllLyric; for ( int32 i = aUtauData.SectionNotesNormalBegin() ; i aUtauData.SectionNotesNormalEnd() ; i++ ) { aNote = aUtauData.SectionNoteAt(i); if ( aNote- GetValue(KEY_NAME_LYRIC, aLyric) == B_OK ) { aAllLyric += aLyric; } else { echo("インデックス "+num_to_string(i)+" の歌詞が設定されていません。"); } } echo("歌詞:"+aAllLyric); それでは、パイプファイルの音符セクション([#0001] など)の情報を取得してみましょう。UTAU 本体で選択されているすべての音符の歌詞を繋げてみます。 音符セクションを管理するクラスは TUtauSectionNote です。パイプファイルにはたくさんの音符セクションが並んでいますが、TUtauData SectionNoteAt() 関数で、TUtauSectionNote へのポインタを取得できます(8 行目)。引数は、何番目の音符セクションかを示すインデックスで、0 から始まります。つまり、SectionNoteAt(0) で最初の音符セクションを取得できます。 したがって、SectionNoteAt(0)、SectionNoteAt(1)……SectionNoteAt(セクションの数-1) というように順に音符セクションを取得していけば、すべての音符セクションにアクセスできます。 ここで注意が必要なのは、[#PREV] セクションの存在です。ご承知の通り、[#PREV] は選択されている音符の前の音符を示します。 SectionNoteAt(0) が返す値は [#PREV] の可能性があります。[#PREV] セクションが不要な場合は、SectionNotesNormalBegin() 関数の出番です(7 行目)。この関数は、[#PREV] セクションを除いた最初のセクションのインデックスを返します。したがって、SectionNoteAt(SectionNotesNormalBegin()) で、[#PREV] セクションを除いた最初の音符セクションを取得することができます。 同様のことが末尾の [#NEXT] セクションについても言えます。そして、SectionNotesNormalEnd() 関数が、[#NEXT] セクションを除いたインデックスの最大値です。 SectionNotesNormalEnd() は STL の end() と同様に有効値の次の値を返すことに注意して下さい。つまり、SectionNoteAt(SectionNotesNormalEnd()) は不正です。SectionNoteAt(SectionNotesNormalEnd()-1) が末尾の音符セクションです。 さて、無事に先頭と末尾のインデックスが分かったので、7~14 行目のループに入ります。 ループの中で各音符の歌詞を取得していますが、歌詞の取得は GetValue() 関数です。 [#SETTING] セクションでテンポを取得した時も GetValue() 関数を使いました。関数名が同じなのは偶然でも何でもなく、実は、TUtauSectionSettings も TUtauSectionNote も、同じ TUtauSection クラスから派生しています。GetValue() 関数は TUtauSection クラスの関数なのです。 したがって、テンポの取得も歌詞の取得もやり方は変わりませんので、解説は省略します。テンポの時と違うのは、歌詞は文字列なので、第 2 引数に string 型へのポインタを渡しています。 パイプファイルのバージョン間の相違を吸収 // パイプファイルのバージョンを管理するクラス const TUtauSectionVersion* aVersion; aVersion = aUtauData.SectionVersion(); // 最初の音符のモジュレーション(int32 型)を取得してみる // UTAU 0.2.90(キー名は "Modulation")でも UTAU 0.2.75(キー名は "Moduration")でも取得できるようにする int32 aMod; aNote = aUtauData.SectionNoteAt(aUtauData.SectionNotesNormalBegin()); if ( aNote- GetValue(aVersion- CompatibilityKey(KEY_NAME_MODULATION), aMod) == B_OK ) { echo("モジュレーションを取得できました:"+num_to_string(aMod)); } else { echo("モジュレーションが設定されていません。"); } 次に、[#VERSION] セクションの管理について解説します。 [#VERSION] セクションを管理するクラスは TUtauSectionVersion です。TUtauData SectionVersion() 関数で、TUtauSectionVersion へのポインタを取得できます(3 行目)。 [#VERSION] セクションはリードオンリーなので(UTAU の仕様上リードオンリーなのかは不明ですが、Lib UTAU ではリードオンリーとして扱っています)、TUtauSectionVersion のポインタ変数を宣言する際は const 付きにしておいて下さい。 さて、UTAU のバージョン(パイプファイルのバージョン)によって、パイプファイルの記述が少しずつ変わってきます。差異を考慮してプログラムを組むのは大変ですが、TUtauSectionVersion は、差異吸収作業を手助けする機能を持っています。 それが CompatibilityKey() 関数です。CompatibilityKey() は、最新の UTAU でのキー名を渡すと、現在読み込んでいるパイプファイルのバージョンに合わせたキー名を返してくれます。 例えば、モジュレーションは、UTAU 0.2.90 では "Modulation" ですが、UTAU 0.2.75 では "Moduration" です(l と r の違い)。 CompatibilityKey() に最新の "Modulation" を表す KEY_NAME_MODULATION を渡し、CompatibilityKey(KEY_NAME_MODULATION) とすると、UTAU 0.2.90 のパイプファイルを読み込んでいる場合は KEY_NAME_MODULATION が返り、UTAU 0.2.75 のパイプファイルを読み込んでいる場合は KEY_NAME_MODURATION が返ります。 つまり、音符セクションからモジュレーションを取得する際、GetValue(aVersion- CompatibilityKey(KEY_NAME_MODULATION), aMod) とすることで、UTAU 0.2.90 だろうと UTAU 0.2.75 だろうと気にせず、モジュレーションの値を取得することができます(9 行目)。 なお、モジュレーションは整数なので、GetValue() の第 2 引数には int32 型へのポインタを渡しています。int32 は要するに long です。short や long だと型の大きさが直感的に分かりづらいので、Lib UTAU では int8、int16、int32 というような表記を用いています。 実のところ、現在、CompatibilityKey() は KEY_NAME_MODULATION を変換する機能しかありません。なんとなく、他にもバージョン間で差異のあるプロパティはある気がしていますが、いまいち把握できていないので、実装できていません。コメント投稿ページで差異を具体的に教えていただければ(UTAU のバージョンとプロパティ名など)、対応を検討させていただきます(必ずしも対応できるとは限りません)。 値の設定 // UTAU で選択されている音符の音の強さ(int32 型)をすべて半分にする int32 aIntensity; for ( int32 i = aUtauData.SectionNotesNormalBegin() ; i aUtauData.SectionNotesNormalEnd() ; i++ ) { aNote = aUtauData.SectionNoteAt(i); if ( aNote- GetValue(KEY_NAME_INTENSITY, aIntensity) == B_OK ) { if ( aNote- SetValue(KEY_NAME_INTENSITY, aIntensity/2) != B_OK ) { echo("インデックス "+num_to_string(i)+" の音の強さを設定できませんでした。"); } } else { echo("インデックス "+num_to_string(i)+" の音の強さが設定されていません。"); } } echo("音の強さを半分にしました。"); これまで値の取得について見てきましたが、今度は、値の設定について解説します。UTAU で選択されている音符の音の強さを、すべて現在の半分に設定してみます。 3~12 行目のループの回し方は、全ての音符の歌詞を取得した時と同じやり方です。 5 行目で、音符の音の強さ(KEY_NAME_INTENSITY)を取得し、int32 型の変数 aIntensity に格納しています。 6 行目が音の強さを設定している箇所です。値の設定には SetValue() 関数を使います。GetValue() 関数と使い方はほとんど同じで、第 1 引数がキー名です。音の強さを設定したいので KEY_NAME_INTENSITY を渡しています。第 2 引数が設定したい値で、現在の半分にしたいので、先ほど取得した aIntensity を 2 で割って渡しています。GetValue() と異なり、SetValue() では第 2 引数は値渡しです。 パイプファイルへの書き戻し // 変更内容をパイプファイルに書き戻す if ( aUtauData.Export(oArgV[1]) == B_OK ) { echo("パイプファイルに変更内容を保存しました。"); } else { echo("パイプファイルに変更内容を保存できませんでした。"); } 設定した値を UTAU 本体に返すには、パイプファイルを更新します。 パイプファイルに変更点を書き出す関数は、TUtauData Export() です(2 行目)。Export() 関数は、TUtauData の全てを書き出すのでは無く、SetValue() で更新されたプロパティのみ書き出します。 以上で、サンプルプログラムの解説を終わります。 追記予定 先行発声やオーバーラップも考慮し、さらに食い込み補正も計算に入れた実質の音符の長さを算出する TUtauSectionNote GetCorrectedDuration() 食い込み補正を計算に入れた値を取得する TUtauSectionNote GetCorrectedPreUtterance()、GetCorrectedVoiceOverlap() 「10,10,10,20,30,50,60,%,10,10,40」というエンベロープの表記を「(10, 20) (20, 30) (30, 40) (475, 50) (485, 60)」というように分かりやすく解釈する TUtauSectionNote GetCorrectedEnvelope() PBS、PBW、PBY に散らばっているピッチベンドをまとめる TUtauSectionNote GetCorrectedPitch()
https://w.atwiki.jp/appproject/pages/35.html
ここを編集 Windows API 結構ためになる! http //ja.wikipedia.org/wiki/Windows_API mallocの最大サイズとか色々実際に試してる http //www.syuhitu.org/other/wadai.html デバイスコンテキストのハンドルから情報を引き出す GetDeviceCaps http //msdn.microsoft.com/ja-jp/library/cc428670.aspx メモリデバイスコンテキスト(CreateCompatibleDC()) http //wisdom.sakura.ne.jp/system/winapi/win32/win104.html http //www13.plala.or.jp/kymats/study/MULTIMEDIA/ScreenCapture.html Windowsのメモリ確保関数の使い分け (HeapAlloc,VirtualAlloc,Local(Global)Alloc,mallec(new)) http //blogs.konuma.org/blog/2006/03/heapallocvirtua_5d49/ メモリ確保関連 http //www.kumei.ne.jp/c_lang/sdk/sdk_82.htm http //keicode.com/windows/win11.php http //nienie.com/~masapico/doc_MemMan.html mallocの限界に挑んでみた http //www.syuhitu.org/other/memory32/memory32.html
https://w.atwiki.jp/vocaloidchly/pages/5424.html
作詞:ナモナキP 作曲:ナモナキP 編曲:ナモナキP 歌:MEIKO 翻譯:yanao 基於相互尊重,請取用翻譯者不要改動我的翻譯,感謝 mallory ah~撫上見慣了的雙唇 搖晃謊言纏繞的身體 月光照耀閃爍不定的亮片海洋 又在優游於誰的夢中了呢? ※ 讓你我擁抱合一在我體內高聲作響吧 宛如被浪打搖的海沙般委身其中 ah~填滿乾涸的玻璃杯 將溶解在泡沫中的話語大口飲盡 藉由首飾傳達而來的熱度逐漸冷卻 是在誰的雙臂中起舞呢? ※※ 將搖曳合一的一瞬間烙印在我體內吧 就用那色彩將我徹底塗改直到厭煩為止吧 ※反覆 ※※反覆
https://w.atwiki.jp/natsutan/pages/56.html
概要 変数名のキャッシュ tcl/generic/tclInt.h ソース /* * Will be grown to contain pointers to the varnames (allocated at the end), * plus the init values for each variable (suitable to be memcopied on init) */ typedef struct LocalCache { int refCount; int numVars; [[Tcl_Obj]] *varName0; } LocalCache;
https://w.atwiki.jp/fo3ss/pages/22.html
最終更新:2016年11月01日) インデックス Fallout 3 DLC日本語化プロジェクト日本語化方法(FOJP)64bit OSでクラッシュする場合の対処法 OP・EDのムービーに日本語字幕を追加する方法 日本語マニュアル 図解日本語化マニュアル Fallout 3 DLC日本語化プロジェクト http //ux.getuploader.com/fo3dlc_l/ 日本語化方法(FOJP) 前置き F3DC(中華exe)より安定性の高いFOJPが開発されたので説明をFOJP日本語化に置き換えてあります。 必須ソフトのダウンロードとインストール 1.Fallout Script Extender (FOSE)のインストールFOSEをダウンロードし解凍したうちfose_loader.exe、fose_○○.dll、fose_editor_○○.dllをFallout 3のルートフォルダに置きます。参考:MOD/拡張 - Fallout 3 Wiki JP 2.Fallout Mod Manager (FOMM)のインストールFOMMをダウンロードしインストール。 参考 FalloutでMOD生活を始める下準備 - 日本語化もMOD。 日本語化手順 1.Fallout 3 DLC日本語化プロジェクトからファイルをダウンロードここでは「FO3日本語化まとめ」 を使います。 +同梱 FOJP2_v4.6.zip FOJP用VANILLA1.7.0.3日本語化[20110123].zip FOJP用5DLCs日本語化[20120302]α版.rar computers_menu v3.zip babybook日本語化.rar序盤のYou re SPECIAL!内のページの翻訳 Fallout3+日本語化キット[20090308]S氏暫定最終ver[1] .zip (内 race_sex_menu.xml)人種や髪型の選択画面の日本語表示に使用 2.解凍した「FO3日本語化まとめ」FO3_rootフォルダ配下のファイルとフォルダを、Fallout 3のルートフォルダにコピー。FOJPフォルダーのVANILLA_PlayerName.txtとVANILLA_PlayerName_jp.txt内の"[プレイヤー名]"を各自が使用している名前に置き換えてください。 3.FOMMを起動し、リストのうち、「JPPatch.esp」にチェックが入ってることを確認。入ってない場合は、チェックを入れる。 4.FOMMのTools>Archive Invalidationにチェックを入れる。(Fallout.iniに必要な更新がされる) 以上です。 Fallout 3のルートフォルダのfose_loader.exeからゲーム起動して日本語化されているかどうか確認してみてください。 場合によってはインストールが必要 基本的にはゲームのインストール時点でインストールが完了していると思われる。 「Microsoft Visual C++ 2010 再頒布可能パッケージ (x86)」 http //www.microsoft.com/downloads/details.aspx?FamilyID=a7b7a05e-6de6-4da-a423-37bf0912db84 displayLang=ja ※ 64bitOSでもx86用を使用します。これより新しいバージョンが入ってる場合はいらないと思います。 「Microsoft Core XML Services (MSXML) 6.0 」 http //www.microsoft.com/downloads/details.aspx?FamilyID=993c0bcf-3bcf-400-be21-27e85e1857b1 displayLang=ja +FO3日本語化まとめを使わずに個別に行う場合 1.まずはファイルを落としてくる まずFallout 3 DLC日本語化プロジェクトで最新のFOJPとFOJP用辞書ファイルを落としてきます。 現時点(2014.08.30)では 本体 FOJP2_v4.6.zip(v4.7.zipは人柱用) 本編用辞書 FOJP用VANILLA1.7.0.3日本語化[20110123].zip(ダウンロードパスワード fo3) DLC用辞書 FOJP用5DLCs日本語化[20120302]α版.rar です。DLC持ってない人はDLC用辞書は要りません(後からDLC導入予定なら、先に入れておいても損はありませんが)。 ※DLC用辞書は意訳でNPCの口調が特徴的になっていたりと多少違和感がありますが 内容が通じなくなる程過剰だった部分は修正されているようです 2.FOJP本体のファイルを組み立てる 全部解凍してください。基本的には各ファイルのreadmeに従って設定すれば大丈夫です。 1.fojp.xmlをFallout3.exeのある場所にコピーする。※ 2._fojp.dllを、Fallout3のフォルダの \Data \fose \plugins \_fojp.dll にコピーする 3.「VANILLAのフォント」フォルダに入っている*.fntファイルを全てFallout3のフォルダの \Data\textures\fonts にコピーする ※fojp.xmlは、最新のFOJP2_v4.6.zipの物を推奨します。(readmeのターミナルの記号を表示する書式の部分(readmeの記述だと誤解しやすい)が最初から変更してあるので) FALLOUT.INIの設定(デフォ) 場所はマイドキュメント/My Games/Fallout3/ [Fonts] sFontFile_1=Textures\Font\Glow_Monofonto_Large.fnt sFontFile_2=Textures\Font\Monofonto_Large.fnt sFontFile_3=Textures\Font\Glow_Monofonto_Medium.fnt sFontFile_4=Textures\Font\Monofonto_VeryLarge02_Dialogs2.fnt sFontFile_5=Textures\Font\Fixedsys_Comp_uniform_width.fnt sFontFile_6=Textures\Font\Glow_Monofonto_VL_dialogs.fnt sFontFile_7=Textures\Font\Baked-in_Monofonto_Large.fnt sFontFile_8=Textures\Font\Glow_Futura_Caps_Large.fnt 3.辞書を入れる 1.Fallout3.exeのある場所に本編用辞書のFOJPフォルダを貼りつけてください。 DLC入ってる人は両方のテキストをFOJPのフォルダにまとめて入れてください。 (仮に、DLCがない状態でDLC用辞書を入れた・設定したとしても不具合は起きません) 2.Data/menus/ に本編用辞書付属の“computers_menu.xml(10/11/09)”を入れてください。 FOJP本体付属の同名ファイル(11/04/19)を使うと、細かい調整の違いでターミナルの翻訳が途中で止まります。 3.ついでに中華exeのS氏暫定最終に入っている“race_sex_menu.xml ”も入れておくと容姿や髪型などのメニューも翻訳されます。 4.辞書を設定する 最初にコピーしたfojp.xmlをメモ帳で開き以下の場所に replacetext ここ→ /replacetext 本編のみの人は以下のテキストを張り付けてください file jp="FOJP/VANILA_Center_jp.txt" en="FOJP/VANILLA_Center_en.txt" align="center"/ file jp="FOJP/VANILA_Center_jp.lower.txt" en="FOJP/VANILLA_Center_en.lower.txt" align="center" priority="20"/ file jp="FOJP/VANILA_Left_jp.txt" en="FOJP/VANILLA_Left_en.txt"/ file jp="FOJP/VANILA_Left_jp.lower.txt" en="FOJP/VANILLA_Left_en.lower.txt" priority="20"/ file jp="FOJP/VANILA_Left_jp.lowest.txt" en="FOJP/VANILLA_Left_en.lowest.txt" priority="30"/ file jp="FOJP/VANILA_Right_jp.txt" en="FOJP/VANILLA_Right_en.txt" align="right"/ file jp="FOJP/VANILA_Right_jp.lower.txt" en="FOJP/VANILLA_Right_en.lower.txt" align="right" priority="20"/ file jp="FOJP/VANILA_PlayerName_jp.txt" en="FOJP/VANILLA_PlayerName_en.txt"/ 本編+DLC(GOTY版でも同じ)の人は以下のテキストを張り付けてください file jp="FOJP/VANILA_Center_jp.txt" en="FOJP/VANILLA_Center_en.txt" align="center"/ file jp="FOJP/VANILLA_Center_jp.lower.txt" en="FOJP/VANILLA_Center_en.lower.txt" align="center" priority="20"/ file jp="FOJP/VANILA_Left_jp.txt" en="FOJP/VANILLA_Left_en.txt"/ file jp="FOJP/VANILA_Left_jp.lower.txt" en="FOJP/VANILLA_Left_en.lower.txt" priority="20"/ file jp="FOJP/VANILA_Left_jp.lowest.txt" en="FOJP/VANILLA_Left_en.lowest.txt" priority="30"/ file jp="FOJP/VANILA_Right_jp.txt" en="FOJP/VANILLA_Right_en.txt" align="right"/ file jp="FOJP/VANILLA_Right_jp.lower.txt" en="FOJP/VANILLA_Right_en.lower.txt" align="right" priority="20"/ file jp="FOJP/VANILA_PlayerName_jp.txt" en="FOJP/VANILLA_PlayerName_en.txt"/ file jp="FOJP/DLC_Center_jp.txt" en="FOJP/DLCs_Center_en.txt" align="center"/ file jp="FOJP/DLC_Center_jp.lower.txt" en="FOJP/DLCs_Center_en.lower.txt" align="center" priority="20"/ file jp="FOJP/DLC_Left_jp.txt" en="FOJP/DLCs_Left_en.txt"/ file jp="FOJP/DLC_Left_jp.lower.txt" en="FOJP/DLCs_Left_en.lower.txt" priority="20"/ file jp="FOJP/DLC_Left_jp.lowest.txt" en="FOJP/DLCs_Left_en.lowest.txt" priority="30"/ を追加して保存してください ※追加でMOD用の辞書を設定する場合も上記と同様の書式で追記していきます。priority=は指定されてなければ省略で構いません。 また、中華exe用と書かれている辞書ファイルはFOJPと同形式なので問題なく使用できます。書式は上記に合わせてください。 5.最後にFOMMでJPPatch.espにチェックを入れて起動してください。(チェックしなくても大きな問題はありません) デフォだと翻訳対象の検索から漏れてしまうダイアログの一部などの細々とした部分を翻訳させるのに使われています。 (装備画面右上の 「Repair R)」→「修理する R)」など) (ターミナルがまともに翻訳されない時は、このチェックと関係ない何かで作業に失敗している時なので意味無いです) FOMMの使い方は下記リンク先を参照してください。 http //wiki.fallout3.z9.org/?MOD%2FTool%2Fallout3ModManager 6.「fojp.xml内の以下のように変更するとターミナルの記号も表示されて良いと思います。。」 本編辞書のreadmeのこの記述ですが、readmeでは本来必須である下記の赤字部分が省略されてしまっている為、 そのままコピペするとターミナルに限らずゲームの全体の翻訳が中途半端になって失敗します。 ミスを防ぐ為、本編辞書のsampleフォルダにあるfojp.xmlを修正して使うか、見本として確認するといいでしょう ※最新版のFOJP2_v4.6.zipの物は既に修正済みなので手を加える必要はありません。 変更後(ターミナルのプロンプトを表示させる) !-- 辞書翻訳時に取り除かれるプリフィックス・サフィックス -- config id="TrimPrefixRegulrExpressions" ![CDATA[^( GID[0-9]+ )]] !-- ID埋め込み -- /config config id="TrimSuffixRegularExpressions" ![CDATA[([ ]$]] /config !-- 辞書翻訳時にバイパスされるプリフィックス・サフィックス -- config id="BypassPrefixRegularExpressions" ![CDATA[^(\a-zA-Z0-9,%\$/ ]+\]|Req .*Ranks [0-9]+| .+ | ) !-- スピーチチャレンジ、スキル要求|Perks|ID埋め込み|ターミナルの記号 -- /config 余談ですが、F3DCのdllをfoseフォルダ以下に入れていると、F3DCを使っていない時でもフォントに悪影響が出ます。 クエスト開始/終了や経験値取得などの大文字フォントが小文字になる ハッキング画面が表示崩れする FOJPでターミナルの翻訳がされなくなる...等 上記のやり方を試してもまだターミナルが日本語化されなかったがArchiveInvalidation Invalidatedを導入した所、日本語化に成功した 以下手順 ファイルをダウンロード http //www.nexusmods.com/fallout3/mod/94/? 1.) First open your FALLOUT3.INI which is located in My Documents\My Games\Fallout3 and search for SArchiveList, once found add "ArchiveInvalidationInvalidated!.bsa" to the list before "Fallout - Textures.bsa". 2.) Search for bInvalidateOlderFiles and change it from 0 to 1. 5.) Save Fallout3.ini. 6.) Place ArchiveInvalidationInvalidated!.bsa into your \Fallout 3\Data\ folder. 64bit OSでクラッシュする場合の対処法 ネタ元 http //svgr.jp/my/Panzer_Hound/diaries/23481 マイDQN\My Games\Fallout3内のFallout.iniを開いて以下の様に設定を修正 bUseThreadedBlood=1(初期値は0) bUseThreadedMorpher=1(初期値は0) bUseThreadedTempEffects=1 bUseThreadedParticleSystem=1(初期値は0) bUseThreadedAI=1(初期値は0) bUseMultiThreadedFaceGen=1 bUseMultiThreadedTrees=1 iNumHavokThreads=5(初期値は1) 使用するコア数を設定。Fallout3が3コア以上に最適化されていないため設定値は2を推奨 屋外、特に室内でフリーズする人は上記のマルチスレッド化と併用を強く推奨 [General]の一番下に追記 iNumHWThread=2 OP・EDのムービーに日本語字幕を追加する方法 Fallout 3 / New Vegas日本語化スレ17 より http //anago.2ch.net/test/read.cgi/game/1330162388/322 1. BikMod Library 0.3eをDLします。http //tools.game-alive.com/forums/viewforum.php?f=4&sid=c431e28db4005654ecbe370456995a1b 2. Fo3-and-FoNV-イントロED字幕.zipをDLします。http //ux.getuploader.com/fo3dlc_t/download/416/Fo3-and-FoNV-%E3%82%A4%E3%83%B3%E3%83%88%E3%83%ADED%E5%AD%97%E5%B9%95.zip1のサイトに繋がらない場合はこちらをDLします。Fo3-and-FoNV-イントロED字幕+bikmodv0.3e.zip 3. Fallout3.exeと同じフォルダにあるbinkw32.dllを、バックアップを取ったあとにlibbinkw32.dllにリネームします。バックアップは必ず取ってください。 4. BikMod Libraryのファイルを解凍して、解凍されたbinkw32.dllとbinkw32.cfgをFallout3.exeと同じフォルダ内に配置します。 5. Fo3-and-FoNV-イントロED字幕.zipを解凍して、解凍されたFallout3フォルダ内の.srtファイルを、ゲームの方の Fallout 3/Data/Videoフォルダに配置します。 6. binkw32.cfgをテキストエディタで編集して設定してください。設定方法はReadme参照のこと。または、Fo3-and-FoNV-イントロED字幕.zip内の、ある程度設定済みのbinkw32.cfgを上書きで配置してください。version_check=1の値を0に変更すると、起動するたびにバージョンチェックされなくなり、更新の催促がなくなります。 7. 完了。ゲーム内で確認してください。各ファイル内のReadmeもよく読んでおいてください。 日本語マニュアル 以下のサイトの下の方からPS3/Xbox360版のPDF形式の日本語マニュアルをダウンロード可能です。 http //bethsoft.com/ja/games/fallout_3_goty ※追記:2016年現在消えていると思うのでInternet Archiveから発掘してみました。 PS3版/Xbox360版 図解日本語化マニュアル http //ameblo.jp/ms-sd-blog/entry-12042475373.html 日本語化の仕方を図解で簡単にまとめてみました。
https://w.atwiki.jp/miracle_mikuru/pages/139.html
http //www44.atwiki.jp/bokuyo/pages/177.html ・"inffas32.obj"と"match686.obj"をビルドする コマンドプロンプト→ "C \Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat" cd Desktop/zlib-1.2.6/contrib/masmx86 bld_ml32.bat ・"inffas32.obj"を"match686.obj"をプロジェクトにD Dで追加する。 ・"unzip.h"をインクルードする前にZLIB_WINAPIを定義する #define ZLIB_WINAPI #include "unzip.h" ・出力ファイル名 出力ファイル→ $(OutDir)zlibwapi.lib$(TargetExt)
https://w.atwiki.jp/yatteyoruby/pages/24.html
概要 rubyからWindowsのCOMを叩くとExcelのデータの中身を操作・閲覧できます。 やり方は下記のページなんかに記述されています。 Rubyist Magazine - Win32OLE 活用法 【第 2 回】 Excel excel_lib rubyのWIN32OLEライブラリを用いるとExcelが操作できます。 しかし、ExcelにはWorkbook,Worksheet,Rangeオブジェクトなどがありますが、 rubyのWIN32OLEで扱うオブジェクトはすべてWIN32OLEクラスになってしまいます。 その問題を解決し、Workbook,Worksheet,Rangeオブジェクトを別個のクラスとして扱うためのライブラリがRubyでExcelのexcel_libとなります。 このライブラリを使うと以下の利点があると思います。 要するにWIN32OLEレベルでExcelをさわるよりこのライブラリを使った方が扱いやすいと思います。 Workbook,Worksheet,Rangeオブジェクトを別個のクラスとして扱えるためわかりやすい。 Workbook,Worksheet,Rangeオブジェクトを拡張したい場合、対応するクラスを拡張すればよい。 各クラスは元のオブジェクトを保持しており、実装していないメソッドも実行でき、拡張が容易に行える。 ライセンスもrubyライセンスなので改変・配布が容易に行える。 ライブラリはrubyスクリプト1ファイルなので解析が容易に行える。 my_excel_lib excel_libを自分に使いやすいように変更してmy_excel_libとしました。 使用例 以下を実行すると、すべてのセルの値を出力し、2列目のセルの値が存在する場合testに変えたtest2.xlsを作成します。 -例 require my_excel_lib Excel.run(false) { |excel| book = excel.copy_book("test.xls") book.worksheets.each { |sheet| sheet.used_range.rows.each { |row| puts row.value.join(",") if row[1] row[1] = "test" end } book.save("test2.xls") } }