# Amanotes Content Reader

### Before you begin

Ama Content Reader is a free library from Amanotes that provides an efficient way to access Amanotes's content store.

### How does it work?

Ama Content Reader helps you to read any content (bin files) of your game from Amanotes Content Store.

# Setup Content Reader for your game

Add npm registry at the top of `./Packages/manifest.json`, then add `com.amanotes.contentreader` package at the end of `dependencies` block. You can get [lastest version here](https://www.npmjs.com/package/com.amanotes.contentreader?activeTab=versions)

``` 
{
    "scopedRegistries": [{
        "name": "Amanotes",
        "url": "https://registry.npmjs.org/",
        "scopes": [
            "com.amanotes"
        ]
    }],

    "dependencies": {
        // Others config goes here
        // ...

        "com.amanotes.contentreader" : "<lastest_version>"
    }
}
```
###Getting license key for Content Reader

Contact your PO to set up and request for a unique key to use the content reader.

### Init Content Reader for your game

Init Key: Init Content Reader in your very first init scene of your game with the license provided by Amanotes

```
/**
 * Project's ID needs to be matched with the license Bundle ID. (example ID: com.amanotes.rnd)
 * @param  licenseKey   provided by Amanotes, please contract Producer Owner from Amanotes to get your license
 */

ContentNoteGenerator.InitKey("U2FsdGVkX1+Z7MdUt2Ladzxcuy/mxlnwcSlyXGduG6uFioT/aWJ7rABeVeB8/3dEjnosq");
```

### Read Notes Data

Import the package

```
using Amanotes.ContentReader;
```

To read notes datas, use GetNotes method in NoteGeneration

```
/**
 * @param  contentFile MIDI content in byte[] format
 * @param  difficulty Which difficulty to generate note for - equals to NoteTab
 * @param  OnComplete Will be call when load file completed
 * @param  OnError Will be call when load file error
 */
  
void ReadNotesData(byte[] contentFile)
{
    NoteGeneration.GetNotes(contentFile, NoteTab.Easy,
        (res,bpm) =>
        {
            Debug.Log("Total notes: " + res.Count);
			Debug.Log("bpm: " + bpm);
		},
        (err) =>
        {
            Debug.Log(err);
        });
}
```

### Customize notes list

First, you should add three variables in your song config files for NoteTab, NoteLine and GridSnap. Bellow are the enum values for these variables:

NoteTab: SupperEasy, Easy, Medium,Hard, Expert
NoteLine: All,LineOne,LineTwo,LineThree,LineFour,LineFive
GridSnap: OneByFour, OneByEight, OneByTwelve, OneBySixTeen, OneByTwentyFour, OneByThirtyTwo, OneByFortyEight, OneBySixtyFour, OneByNinetySix

To filter notes datas, use Filter method in NoteGeneration.

```
/**
* Get notes only from specific line
*
* @param  notes get from function ReaderNoteData
* @param  NoteLine Which NoteLine to generate note for - this parameters should be retrieved from song configs
*/
  
List<NoteData> FilterNoteData(List<NoteData> notes)
{
	return NoteGeneration.Filter(notes, NoteLine.All);
}

/**
* Custom the density of notes
*
* @param  notes get from function ReaderNoteData
* @param  bpm get from function ReaderNoteData
* @param  GridSnap Which GridSnap to generate note for -  this parameters should be retrieved from song configs
*/
  
List<NoteData> TranslateNoteData(List<NoteData> notes, float bpm)
{
	return NoteGeneration.Translate(bpm, notes, GridSnap.OneByEight);
}
```

### Example Content Reader

First, you need to install ExampleContentReader.unitypackage 


```
public string license; //Content Reader licensing from Amanotes
public string fileName;
public NoteTab noteTab;
private float bpm;
List<NoteData> notesData;
void Start()
{
        /*Note 
        The Unity project's ID needs to be matched with the license Bundle ID. (example ID: com.amanotes.rnd)
        */
        ContentNoteGenerator.InitKey(license);
        ExampleReadContentFile();

        FileUtils f = new FileUtils();
        f.GetListFiles();
}

public void OnClickButtonRead()
{
    ExampleReadContentFile();
}


void ExampleReadContentFile()
{
    string contentPath = GetStreammingAssetsPath(fileName);
    WWW reader = new WWW(contentPath);
    while (!reader.isDone) { }
    notesData = ReaderNoteData(reader.bytes);
    Debug.Log("Total notes: " + notesData.Count);

    //Use noteTimes below to generate object for your game
    for (int i = 0; i < notesData.Count; i++)
    {
        float noteTime = notesData[i].timeAppear;
        Debug.Log("noteTime: " + noteTime);
    }
}

public string GetStreammingAssetsPath(string name)
{
#if UNITY_EDITOR_OSX
    return "file://"+Application.streamingAssetsPath + "/" + name;
#elif UNITY_EDITOR
    return Application.streamingAssetsPath + "/" + name;
#elif UNITY_ANDROID
    return Path.Combine("jar:file://" + Application.dataPath + "!/assets" , name);
#elif UNITY_IOS
    return Path.Combine(Application.dataPath + "/Raw" , name);
#else
    return Application.streamingAssetsPath + "/" + name;
#endif
}

//To read notes datas, use GetNotes method in NoteGeneration
/**
* @param  contentFile MIDI content in byte[] format
* @param  NoteTab Which NoteTab to generate note for
* @param  OnComplete Will be call when load file completed
* @param  OnError Will be call when load file error
*/
List<NoteData> ReaderNoteData(byte[] contentfile)
{
    List<NoteData> notes = new List<NoteData>();
    NoteGeneration.GetNotes(contentfile, NoteTab.SupperEasy,
    (res, bpm) =>
    {
        this.bpm = bpm;
        for (int i = 0; i < res.Count; i++)
        {
            notes.Add(res[i]);
            Debug.Log(notes[i].stringIndex);
        }
    },
    (err) =>
    {
        Debug.Log(err);
    });
    return notes;
}
```


# Versioning

We use [SemVer](http://semver.org/) for versioning.

# License

This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details
