JSFiddle - React, Tailwind, and code Playground

HTML

<form id="meta">
    <div><input type="file" id="files" name="file"></div>
    <div><input type="text" id="title" name="title"></div>
    <div><input type="text" id="artist" name="artist"></div>
    <div><input type="text" id="album" name="album"></div>
    <div><input type="text" id="year" name="year"></div>
</form>

CSS

input {width:300px;}
form div {margin-bottom:5px;}

JavaScript

var BinaryBuffer=function(buffer){
    this.buffer=buffer;
    this.length=buffer.length;
};
BinaryBuffer.prototype={
    // Функция возвращающая часть данных
    slice:function(offset,length){
        var buffer=new ArrayBuffer(length);
        for(var i=offset,j=0;i<this.length && j<length;i++,j++){
            buffer[j]=this.buffer[i];
        }
        return new BinaryBuffer(buffer);
    },
    // Возвращаем определенный байт
    byteAt:function(i){
        return this.buffer[i]&0xFF;
    },
    // Возращаем ASCII символ
    charAt:function(i){
        var code=this.byteAt(i);
        if(code==0)return "?";
        if(code<32)return "?";
        return String.fromCharCode(code);
    },
    // Возращаем ASCII строку
    stringAt:function(offset,length){
        var str=[];
        for(var i=offset,j=0;i<offset+length;i++,j++) {
            str[j]=this.charAt(i);
        }
        return str.join("");
    },
    // Возращаем ASCII для всего массива данных
    toString:function(){
        return this.stringAt(0,this.length);
    }
};

var ID3v2=function(){
    // Cюда будем сохранять ошибки
    this.errors=[];
    // Версия тега
    this.version='Unknown';
    // Флаги тега
    this.flags={
        isUnSynchronisation:false,
        hasExtendedHeader:false,
        isExperimental:false,
        hasFooter:false
    };
    // Размер тега в байтах. Размер не включает 10 байт заголовка и 10 байт футера (при наличии его)
    this.size=0;
    // Фреймы тега
    this.frames={};
};
ID3v2.prototype.readFromFile=function(file,callback){
    // Проверим на всякий случай второй параметр
    if(!(callback instanceof Function)){
        callback=function(target){};
    }
    
    var self=this,
        // нам понадобится FileReader
        reader=new FileReader;
    
    // Расшифруем Synchsafe - в данном виде хранятся размеры тега  размеры фрейма, подробнее в интернете, например, в Вики
    // http://en.wikipedia.org/wiki/Synchsafe
    function UnSynchsafeInt(buffer){
     ...