firmware of NBCTRLV1 / AYC01

Dependencies:   SDFileSystemEx mbed

nlg_mini.cpp

Committer:
bkc_mbed
Date:
2016-04-18
Revision:
1:29f0e76a9999
Parent:
0:722cc5360dc3

File content as of revision 1:29f0e76a9999:


//
// nlg_mini.cpp
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "nlg_mini.h"

/* 単位を扱いやすいように */
typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned long dword;

// 変数読み出し(WORD)
word ReadWORD(byte *p)
{
    return
        ((word)p[0]) |
        ((word)p[1])<<8;
}

// 変数読み出し(DWORD)
dword ReadDWORD(byte *p)
{
    return
        ((dword)p[0]) |
        ((dword)p[1])<<8 |
        ((dword)p[2])<<16 |
        ((dword)p[3])<<24;
}

// NLGファイルを開く
int OpenNLG(NLG_CTX *np, const char *filename)
{
    byte hdr[0x60];

    np->fp = fopen(filename, "rb");

    // ファイルが開けない
    if (!np->fp)
        return NLG_FILEERR;

    // ヘッダ部分の読み込み
    fread(hdr, 0x60, 1, np->fp);

    // IDの確認
    if (memcmp(hdr, "NLG1", 4) != 0)
    {
        CloseNLG(np);
        return NLG_UNK_FORMAT;
    }

    // バージョン
    np->version = ReadWORD(hdr + 4);

    // クロック
    np->baseclk = ReadDWORD(hdr + 72);

    // ティック
    np->tick = ReadDWORD(hdr + 76);
    np->tick_us = np->tick / 4;

    // 長さ
    np->length = ReadDWORD(hdr + 88);

    // 位置
    fseek(np->fp, 0x60, SEEK_SET);

    // CTC初期化
    np->ctc0 = np->ctc3 = 0;

    return NLG_OK;
}

// ファイルを閉じる
void CloseNLG(NLG_CTX *np)
{
    if (!np->fp)
        return;

    fclose(np->fp);

#if defined(__MICROLIB) && defined(__ARMCC_VERSION) // with microlib and ARM compiler
    free(np->fp);
#endif

    np->fp = NULL;
}

// データの読み出し
int ReadNLG(NLG_CTX *np)
{
    return fgetc(np->fp);
}

// ファイルポインタの位置を取得
long TellNLG(NLG_CTX *np)
{
    return ftell(np->fp);
}

// ファイルポインタの位置を設定
void SeekNLG(NLG_CTX *np, long pos)
{
    fseek(np->fp, pos, SEEK_SET);
}

// ティック(us)の取得
int GetTickUsNLG(NLG_CTX *np)
{
    return np->tick_us;
}

// Set Tick
// (CTC0 * 64us) * CTC3
static inline void SetTickNLG(NLG_CTX *np)
{
    np->tick = ((np->ctc0 * 256) * np->ctc3);
    np->tick_us = np->tick / 4;
}

// CTC0値の設定
void SetCTC0_NLG(NLG_CTX *np, int value)
{
    np->ctc0 = value;
    SetTickNLG(np);
}

// CTC3値の設定
void SetCTC3_NLG(NLG_CTX *np, int value)
{
    np->ctc3 = value;
    SetTickNLG(np);
}

// 曲の長さを得る
int GetLengthNLG(NLG_CTX *np)
{
    return np->length;
}

// ベースクロックを得る
int GetBaseClkNLG(NLG_CTX *np)
{
    return np->baseclk;
}