記事公開:
最終更新: 2017年10月30日
更新回数: 9回

(中止)CrossTie開発日誌(2017年6月)

CrossTie開発日誌は2017年10月30日をもって中止と致します。中止に至った理由などについてはこちらの記事を参照してください

2017年6月18日

DXライブラリを使えばよいのではないか、という考えに至った。公式に用意されているC#用のライブラリのサンプルは正常に動作した。音声系の命令も用意されていて、ほぼDXライブラリで完結できそう。CrossTieのエンジンはC#とDXライブラリで作る、というので良さそうな気がしている。

2017年6月17日

若干もやもやが残っているので、音声の続きから。

検索語句「C# OGG デコーダ」。あるにはあるが、難しそうだ。音声で躓いてしまうと、C言語に戻ってしまう予感が少しある。OpenALは使えるだろうか。

検索語句「C# OpenAL」。試みは色々あるようだ。プログラムが肥大化するのは避けたい。

検索語句「C# flac 再生」。検索していたら、NAudioというものにたどり着いた。C# プログラミング解説。そういえばVisualStudioにはNuGetというパッケージマネージャがあるので、それを使った導入なら、かなり楽なのではないか。少し調べてみる。

検索語句「C# MP3 再生 NuGet」。先程のページに加え、このページもヒット。Bakulog。こちらもNAudioというライブラリを紹介している。C#での音声操作にはうってつけなのかもしれない。

NAudioをNuGetで入れてみる。ソリューションエクスプローラから現在のプロジェクトを右クリック、NuGetパッケージの管理をクリック、出てきた表示から参照のタブを選んで、検索ボックスにNAudioと入力。検索結果のNAudioを選択して、インストールする。NAudio.Vorbisというのもあったから、もしかするとOGGの再生もできるのかもしれない。NAudioのライセンスはMicrosoft Public Licenseで、MicrosoftによるBSDに近いライセンスとのこと。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NAudio.Wave;

namespace crosstie_script
{
  class Program
  {
    static void Main(string[] args)
    {
      // 音声を読み込んで再生する
      string exe_dir = System.AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\');
      string file_path = exe_dir + @"\test.mp3";
      if (System.IO.File.Exists(file_path))
      {
        AudioFileReader reader = new AudioFileReader(file_path);
        WaveOut waveOut = new WaveOut();
        waveOut.Init(reader);
        waveOut.Play();
        while (waveOut.PlaybackState == PlaybackState.Playing) ; // 再生の終了を待つ
      }
      else
      {
        Console.WriteLine("ファイルがありません");
      }
    }
  }
}

あっさり成功。重複するがC# プログラミング解説のNAudioのページはチェックしておこう。音声は現時点ではNAudioを使うのが良さそうという感じ。

一区切り。

C#で個人的な過去の資産を再利用できるか確認してみたい。

検索語句「C# GLFW」。どちらかというとC++の情報が出てくる。NuGetでも検索してみる。GLFW.NETというものが出てきた。プロジェクト名は「GLFW3.NET」というものらしい。日本語の情報はあまりない。

ピクセル単位での描画をしたいので、調べる。

検索語句「C# ピクセル 描画」。C#ビギナー SetPixelで点を描画するという記事が出てきた。SetPixelメソッドを使う方法らしい。試してはいないが、スピードを出すのに工夫がいりそうなので、調べる。

検索語句「C# SetPixel fast」。StackOverflowの記事がヒットする。任意のピクセルデータからビットマップデータを生成する感じだろうか。

検索語句「C# opengl 2d」。OpenTKに関するQiitaの記事がヒットした。GLControlも併用すると良いと書いてある。どのように使うのだろうか。

検索語句「C# OpenTK」。幾つかの日本語ページがヒット。#region OpenTKMTail3 C#でOpenTKを使ってOpenGL(準備)など。後者を参考にしつつ、作ってみる。

C#フォームアプリケーションを作成する。プロジェクト名はcrosstie-engine。NuGetパッケージマネージャからOpenTKとOpenTK..GLControlをインストールする。コントロールの追加でハマったので調べる。

検索語句「C# controls add」。[DOBON.NET コントロールを実行時に作成する]。

うまくいかないので、コンソールアプリの方でも試してみる。このページを参考に作成する。できた。

しかし、OpenTKでDrawPixelsをする例が見当たらず、試しても動作しないので、中断。

2017年6月16日

コンソールアプリで音声を扱えるのか分からなかったので、試す。

検索語句「C# サウンド 再生」。WAVEファイルを再生する(DOBON.NET)System.Media.SoundPlayerを使用するらしい。

string exe_dir = System.AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\');
string file_path = exe_dir + @"\test.mp3";
if (System.IO.File.Exists(file_path)) {
  System.Media.SoundPlayer sound_player = new System.Media.SoundPlayer(file_path); // 読み込む
  sound_player.Play(); //非同期再生する
}
else {
  Console.WriteLine("ファイルがありません");
}

有効なWAVEファイルではありませんとのエラー。WAV形式でないといけないのだろうか。調べ直す。

検索語句「C# MP3 再生」。MCIを使用する方法が出てくるが、個人的には好ましくない。他の方法を探す。

検索語句「C# OGG 再生」。DLLを使用する方法が出てくる。好ましくない。さらに、System.Media.SoundPlayerを使った再生では、複数同時再生はできないとのこと。

妥協して、WAVをファイルを再生しようとする。

string exe_dir = System.AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\');
string file_path = exe_dir + @"\test.wav";
if (System.IO.File.Exists(file_path)) {
  System.Media.SoundPlayer sound_player = new System.Media.SoundPlayer(file_path); // 読み込む
  sound_player.Play(); //非同期再生する
}
else {
  Console.WriteLine("ファイルがありません");
}

エラーは出なくなったが音がならない。sleepすればよいのだろうか。調べる。

検索語句「C# sleep」。System.Threading.Thread.Sleep()メソッドを使う。時間はミリ秒。

string exe_dir = System.AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\');
string file_path = exe_dir + @"\test.wav";
if (System.IO.File.Exists(file_path)) {
  System.Media.SoundPlayer sound_player = new System.Media.SoundPlayer(file_path); // 読み込む
  sound_player.Play(); //非同期再生する
  System.Threading.Thread.Sleep(3000);
}
else {
  Console.WriteLine("ファイルがありません");
}

曲の本の冒頭だけは再生された。

2017年6月15日

VisualStudio2017でC#コンソールアプリを新規作成する。プロジェクト名はcrosstie-script。CrossTieリポジトリ内に作成。

検索語句「C# カレントディレクトリ」。C#とVB.NETの入門サイト。取得方法は2つ。System.IO.Directory.GetCurrentDirectory()メソッドを使う方法と、System.Environment.CurrentDirectoryプロパティを使う方法。どちらもstringが返る。前者を使う。

検索語句「C# コンソール 出力」。ITLAB51.COMConsole.WriteLine("")メソッドを使う。メソッドを使って、カレントディレクトリを出力してみる。

Console.WriteLine(System.IO.Directory.GetCurrentDirectory());。Ctrl+F5で実行。

無事に実行ファイルのあるディレクトリが返る。

カレントディレクトリ=実行ファイルのあるディレクトリなのか、不安になったので調べる。

検索語句「C# 実行ファイル ディレクトリ 取得」。nmm実験室。この記事の調査によれば、結論としてSystem.AppDomain.CurrentDomain.BaseDirectory;あるいは、Directory.GetParent(Assembly.GetExecutingAssembly().Location);のどちらかが良いとのこと。見た感じ、前者の方がシンプルだが、末尾に\マークが付く場合とつかない場合があるとのことで、その場合はSystem.AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\');とするとよいとのこと。試してみる。

string exe_dir = System.AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\');
Console.WriteLine(exe_dir);

正常に取得できた。次にファイルの有無を確認したい。

検索語句「C# ファイル 有無」。DOBON.NETSystem.IO.File.Exists(filePath)で取得できるとのこと。試してみる。その前に、C#の文字列について不安になったので、調べる。

検索語句「C# 文字列 初期化」。文字通り初期化について出たので、調べ直す。

検索語句「C# 文字列」。ゆめとちぼーとげんじつと。@を利用すると、エスケープを行わずに「/」を文字列に含められる、とのこと。パスを記述する際は、@を利用して書くと良いのかもしれない。試してみる。

string exe_dir = System.AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\');
string file_path = exe_dir + @"\test.txt";
if (System.IO.File.Exists(file_path)) {
  Console.WriteLine("ファイルがあります");
}
else {
  Console.WriteLine("ファイルがありません");
}

ファイルがある場合とない場合で試して、どちらも正常に動作したことを確認。

次にファイルの内容を変数に読み込んでみたい。調べる。

検索語句「C# テキスト ファイル 読み込み」。DOBON.NET。テキストファイルがUTF-8の場合はエンコーディングの指定を省略できるとあったので省略して書く。

string exe_dir = System.AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\');
string file_path = exe_dir + @"\test.txt";
if (System.IO.File.Exists(file_path)) {
  System.IO.StreamReader sr = new System.IO.StreamReader(file_path); //UTF-8として開く
  string txt = sr.ReadToEnd(); //内容をすべて読み込む
  sr.Close(); //閉じる
  Console.WriteLine(txt);
}
else {
  Console.WriteLine("ファイルがありません");
}

正常に動作した。

2017年6月14日

モチベーションもままならないままスタート。Githubリポジトリを作成した。リポジトリ名はcrosstie