Back to Top

プログラムの覚書

Category: VB.NET

VB.NET

VB.NET 固定長ファイルの読み込み・書き込み

固定長ファイル(ランダムファイル)の読み込み、書き込みについて説明します。

固定長ファイルは、データがテキスト形式とは限りません。バイナリー形式もあります。

VBでは、FileSystem クラスを使用することにより、簡単に固定長ファイルのアクセスが出来ます。

・System.Runtime.InteropServicesをインポートします。

 

FileSystem クラスを使用して、固定長ファイルの読み書きをする

固定長ファイルの構造体

<StructLayout(LayoutKind.Sequential, Pack:=1)>
Friend Structure Person
    <VBFixedArray(10 - 1)> Public Name() As Byte
    <VBFixedArray(5 - 1)> Public Age() As Byte
End Structure

ランダムファイルの読み書き

Dim FilePath As String = "C:\work\myrfile.txt"

'レコード長を取得する
Dim recordLen As Long = Len(New Person())

Dim pos As Person = New Person()

'ファイルをオープンする
Dim FileNo As Integer = FileSystem.FreeFile
FileSystem.FileOpen(FileNo, FilePath, OpenMode.Random, OpenAccess.ReadWrite, OpenShare.Default, recordLen)

'全レコード数を取得する
Dim recordMax As Long = FileSystem.LOF(FileNo) \ recordLen

'1レコード読み込む(先頭レコード)
FileSystem.FileGet(FileNo, pos, 1)

'1レコードを書き込む(最終レコードに追加)
FileSystem.FilePut(FileNo, pos, recordMax + 1)

'ファイルをクローズする
FileSystem.FileClose(FileNo)

 

VB.NET Accord 音声入力

Accord.NETを使用して音声入力をする方法を記載します。

USB接続カメラなどについている 音声入力デバイスの音声を、入力信号として取得します。

  • Accord.Video
  • Accord.DirectSound
  • Accord.Audio.Formats

をインポートします。

 

音声入力データを取得する

以下のコードは、音声入力を取得して、MemoryStreamにデータを蓄えます。その音声データを SoundPlayerで再生します。

・フォーム上には、[録音開始][録音停止][再生]のボタンを配置します。

Private player As System.Media.SoundPlayer = Nothing

Dim _Stream As MemoryStream
Dim _Encoder As WaveEncoder

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    '音声入力デバイスを取得して、ComboBoxに設定
    Dim audioDevices = New AudioDeviceCollection(AudioDeviceCategory.Capture)

    ComboBox1.Items.Clear()
    If AudioDevices.Count <> 0 Then
        For Each device As AudioDeviceInfo In audioDevices
            ComboBox1.Items.Add(device)
        Next
        ComboBox1.SelectedIndex = 0
    End If
End Sub


Dim _AudioSource As IAudioSource

'音声入力開始
Private Sub StartButton_Click(sender As Object, e As EventArgs) Handles StartButton.Click
    If ComboBox1.Items.Count = 0 Then
        Return
    End If

    Dim info As AudioDeviceInfo = ComboBox1.SelectedItem()
 
    _Stream = New MemoryStream()             '音声データ出力用ストリーム作成
    _Encoder = New WaveEncoder(_Stream)

    '音声入力デバイスを作成して、22050Hzに設定
    _AudioSource = New AudioCaptureDevice(info)
    _AudioSource.DesiredFrameSize = 2048
    _AudioSource.SampleRate = 22050

    AddHandler _AudioSource.NewFrame, AddressOf Me.Audio_NewFrame
    AddHandler _AudioSource.AudioSourceError, AddressOf Me.Audio_SourceError

    _AudioSource.Start()                     '音声入力開始
End Sub

'音声入力停止
Private Sub StopButton_Click(sender As Object, e As EventArgs) Handles StopButton.Click
    If _AudioSource Is Nothing Then
        Return
    End If

    If _AudioSource.IsRunning Then
        _AudioSource.SignalToStop()     'Audioデバイスの停止
        _AudioSource.WaitForStop()      '完全に停止するまで待つ
        _AudioSource = Nothing
    End If
End Sub

'入力デバイスのデータを取得する
Private Sub Audio_NewFrame(sender As Object, eventArgs As Accord.Audio.NewFrameEventArgs)
    _Encoder.Encode(eventArgs.Signal)                'エンコーダーに音声信号を追加する
End Sub

'このコールバックは、オーディオに何らかのエラーがあるときに呼び出されます。
Private Sub Audio_SourceError(sender As Object, e As AudioSourceErrorEventArgs)
    Throw New Exception(e.Description)
End Sub


Private player As System.Media.SoundPlayer = Nothing
'入力された音声を再生する
Private Sub PlayerButton_Click(sender As Object, e As EventArgs) Handles Button1.Click
    _Stream.Seek(0, SeekOrigin.Begin)             'ストリームのオフセットを開始位置に設定する

    '読み込む
    Using player = New System.Media.SoundPlayer(_Stream)
        player.Play()                             '非同期再生する
    End Using
End Sub

 

Posted in Accord | Leave a reply