PHung Tung / SD_PlayerSkeleton

Dependencies:   SDFileSystem_Warning_Fixed

Dependents:   DISCO-F746_WAV_PLAYER WAV

Files at this revision

API Documentation at this revision

Comitter:
phungductung
Date:
Tue Jun 04 21:35:59 2019 +0000
Parent:
17:abfd6af9a236
Child:
19:9f34d9b4a6a7
Commit message:
WAV

Changed in this revision

FileSelectorWav.cpp Show annotated file Show diff for this revision Revisions of this file
FileSelectorWav.hpp Show annotated file Show diff for this revision Revisions of this file
SD_PlayerSkeleton.cpp Show annotated file Show diff for this revision Revisions of this file
SD_PlayerSkeleton.hpp Show annotated file Show diff for this revision Revisions of this file
SD_WavReader.cpp Show annotated file Show diff for this revision Revisions of this file
SD_WavReader.hpp Show annotated file Show diff for this revision Revisions of this file
--- a/FileSelectorWav.cpp	Thu Mar 23 02:58:48 2017 +0000
+++ b/FileSelectorWav.cpp	Tue Jun 04 21:35:59 2019 +0000
@@ -1,8 +1,4 @@
-//--------------------------------------------------------------
-//  FileSelector class
-//      SD カード内のファイル名の一覧を表示し,ファイルを選択する
-//
-//  2017/03/23, Copyright (c) 2017 MIKAMI, Naoki
+
 //--------------------------------------------------------------
 
 #include "FileSelectorWav.hpp"
@@ -27,7 +23,7 @@
         rect_->EraseAll();
         next_.EraseAll();
 
-        // Label を生成
+        // Tạo Label 
         for (int n=0; n<MAX_LIST_PAGE_; n++)
             fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "",
                                            Label::LEFT, Font16, BASE_COLOR_);
@@ -39,7 +35,7 @@
         for (int n=0; n<MAX_LIST_PAGE_; n++) delete fileNameLabels_[n];
     }
 
-    // ファイルの一覧表を作る.WAV ファイルが存在しない場合は false を返す
+   // Lập danh sách các tập tin. Trả về false nếu tệp WAV không tồn tại
     bool FileSelector::CreateTable()
     {
         DIR* dp = opendir("/sd");
@@ -56,9 +52,9 @@
                 if ( (strName.find(".wav") != string::npos) ||
                      (strName.find(".WAV") != string::npos) )
                 {
-                    sdReader_.Open(strName);        // ファイルオープン
+                    sdReader_.Open(strName);      // mở tập tin
 
-                    // PCM,16 ビットステレオ,標本化周波数 44.1 kHz 以外のファイルは除外
+                    // Loại trừ các tệp không phải PCM, âm thanh nổi 16 bit, tần số lấy mẫu 44,1 kHz
                     if (sdReader_.IsWavFile())
                         fileNames_[fileCount_++] = strName;
                     sdReader_.Close();
@@ -68,15 +64,15 @@
             closedir(dp);
         }
         else
-            return false;                   // SD カードが装着されていない場合
-        if (fileCount_ == 0) return false;  // 該当する WAV ファイルが存在しない場合
+            return false;                   // nếu thẻ SD không được cài đặt
+        if (fileCount_ == 0) return false;  //Nếu tệp WAV tương ứng không tồn tại
 
         div_t m = div(fileCount_, MAX_LIST_PAGE_);
         maxPage_ = (m.rem == 0) ? m.quot : m.quot+1;
-        return true;                        // 該当する WAV ファイルが存在する場合
+        return true;                        //Khi tệp WAV tương ứng tồn tại
     }
 
-    // ファイルを選択する
+   // chọn tập tin
     bool FileSelector::Select(string &fileName)
     {
         int m;
@@ -96,11 +92,11 @@
             fileNameLabels_[n]->Draw(GetFileNameNoExt(k),
                                      TOUCHED_COLOR_);
             fileName = fileNames_[k];
-            // 同じページで以前に選択されているファイル名の色を戻す
+          // Trả về màu của tên tệp đã chọn trước đó trên cùng một trang
             if (nOld_ != -1)
                 fileNameLabels_[nOld_]->Draw(GetFileNameNoExt(kOld_),
                                              BASE_COLOR_);
-            if (page_ == maxPage_)      // 最後のページで余分な四角形を消去
+            if (page_ == maxPage_)      // xóa hình chữ nhật phụ trên trang cuối
                 for (int j=fileCount_ % MAX_LIST_PAGE_ + 1;
                      j < MAX_LIST_PAGE_; j++) rect_->Erase(j);
             nOld_ = n;
@@ -112,7 +108,7 @@
             return false;
     }
 
-    // ファイルの一覧の表示
+    // Hiển thị danh sách các tập tin
     void FileSelector::DisplayFileList(bool sortEnable)
     {
         if (sortEnable)
@@ -126,17 +122,16 @@
         for (int n=0; n<count; n++) rect_->Draw(n);
         for (int n=0; n<count; n++)
             fileNameLabels_[n]->Draw(GetFileNameNoExt(n+(page_-1)*MAX_LIST_PAGE_));
-
-        // 前のページ,次のページの選択ボタンなどを表示する
+// Hiển thị trang trước, nút chọn trang tiếp theo, v.v.
         next_.InactivateAll();
-        if (page_ > 1) next_.Activate(0);           // "<" 有効
-        if (page_ < maxPage_) next_.Activate(1);    // ">" 有効
+        if (page_ > 1) next_.Activate(0);          // "<" hợp lệ
+        if (page_ < maxPage_) next_.Activate(1);   // ">" hợp lệ
         char page[6];
         sprintf(page, "%d/%d", page_, maxPage_);
         pageLabel_.Draw(page);
     }
 
-    // ファイルの一覧の消去
+    // xóa danh sách các tập tin
     void FileSelector::Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
                              uint32_t color)
     {
@@ -144,7 +139,7 @@
         lcd_.FillRect(x, y, width, height);
     }
 
-    // 拡張子を削除したファイル名を取得
+   // Lấy tên tệp với phần mở rộng bị xóa
     string FileSelector::GetFileNameNoExt(int n)
     {
         string name = fileNames_[n];
--- a/FileSelectorWav.hpp	Thu Mar 23 02:58:48 2017 +0000
+++ b/FileSelectorWav.hpp	Tue Jun 04 21:35:59 2019 +0000
@@ -1,8 +1,4 @@
-//--------------------------------------------------------------
-//  FileSelector class ---- Header ----
-//      SD カード内のファイル名の一覧を表示し,ファイルを選択する
-//
-//  2017/03/23, Copyright (c) 2017 MIKAMI, Naoki
+
 //--------------------------------------------------------------
 
 #ifndef FILE_SELECTOR_HPP
@@ -10,7 +6,7 @@
 
 #include "F746_GUI.hpp"
 #include "SD_WavReader.hpp"
-#include <algorithm>    // sort() で使用
+#include <algorithm>    // Được sử dụng bởi sort() 
 #include <string>
 
 namespace Mikami
@@ -23,21 +19,20 @@
 
         virtual ~FileSelector();
         
-        // ファイルの一覧表を作る.WAV ファイルが存在しない場合は false を返す
+       // Lập danh sách các tập tin. Trả về false nếu tệp WAV không tồn tại
         bool CreateTable();
-
-        // ファイルを選択する
+        // chọn tập tin
         bool Select(string &fileName);
 
-        // ファイルの一覧の表示
+        // Hiển thị danh sách các tập tin
         void DisplayFileList(bool sortEnable = true);
 
-        // ファイルの一覧の消去
+        // xóa danh sách các tập tin
         void Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
                    uint32_t color = GuiBase::ENUM_BACK);
 
     private:
-        static const int MAX_LIST_PAGE_ = 6;  // 1ページに表示するファイル数の最大値
+        static const int MAX_LIST_PAGE_ = 6;  // Số lượng tệp tối đa được hiển thị trên một trang
         static const uint8_t W_H_ = 24;
         static const uint8_t V_L_ = 36;
         static const uint32_t BASE_COLOR_ = 0xFF80FFA0;
@@ -53,16 +48,16 @@
         Label pageLabel_;
         LCD_DISCO_F746NG &lcd_;
         SD_WavReader &sdReader_;
-        int page_;      // 現在のページ,最初のページは 1
-        int nOld_;      // ページ内で以前選択したファイルのインデックス
-        int kOld_;      // 以前選択したファイルのインデックス
+        int page_;      // Trang hiện tại, trang đầu tiên là 1
+        int nOld_;      // Chỉ mục của tệp đã chọn trước đó trong trang
+        int kOld_;      // Chỉ mục của tệp đã chọn trước đó
         int maxPage_;
         int fileCount_;
 
-        // 拡張子を削除したファイル名を取得
+        // Lấy tên tệp với phần mở rộng bị xóa
         string GetFileNameNoExt(int n);
 
-        // コピー・コンストラクタとオブジェクトの代入演算子は使用禁止
+        // Không sử dụng các hàm tạo sao chép và toán tử gán đối tượng
         FileSelector(const FileSelector&);
         FileSelector& operator=(const FileSelector&);
     };
--- a/SD_PlayerSkeleton.cpp	Thu Mar 23 02:58:48 2017 +0000
+++ b/SD_PlayerSkeleton.cpp	Tue Jun 04 21:35:59 2019 +0000
@@ -1,7 +1,4 @@
-//--------------------------------------------------------------
-//  SD プレーヤー用抽象基底クラス
-//
-//  2017/03/22, Copyright (c) 2017 MIKAMI, Naoki
+
 //--------------------------------------------------------------
 
 #include "SD_PlayerSkeleton.hpp"
@@ -29,7 +26,7 @@
         else             reset_ = NULL;
     }
 
-    // SD プレーヤーの処理の実行
+   // thực thi xử lý trình phát SD
     void SD_PlayerSkeleton::Execute()
     {
         bool playOk = false;
@@ -37,47 +34,47 @@
 
         while (true)
         {
-            if (playOk)             // PAUSE 後の PLAY の場合
+            if (playOk)             // Trong trường hợp PLAY sau PAUSE
                 loopCount = SD_Open();
-            else                    // PAUSE 後の PLAY ではない場合
+            else                    // Nếu không PLAY sau PAUSE
             {
                 if (0 == WaitTouched()) SelectFile();
                 loopCount = SD_Open();
-                while (1 != WaitTouched()) {}   // PLAY がタッチされるまで待つ
+                while (1 != WaitTouched()) {}   // Đợi cho đến khi PLAY được chạm
             }
 
-            Display();  // アプリ固有の表示処理(仮想関数)
+            Display();  // Xử lý hiển thị dành riêng cho ứng dụng (chức năng ảo)
             if (reset_ != NULL) reset_->Draw();
 
-            menu_.Inactivate(0);    // SELECT ボタン無効
-            menu_.Activate(2);      // PAUSE ボタン有効
-            menu_.Activate(4);      // STOP ボタン有効
+            menu_.Inactivate(0);    // SELECT bị vô hiệu hóa
+            menu_.Activate(2);      // PAUSE bị vô hiệu hóa
+            menu_.Activate(4);      // STOP bị vô hiệu hóa
 
             playOk = false;
             bool stopOk = false;
 
-            Clear();    // アプリ固有のクリア処理(仮想関数)
+            Clear();   // Quá trình xóa ứng dụng cụ thể (chức năng ảo)
 
-            mySai_.PlayOut();       // Play 開始
+            mySai_.PlayOut();       // Play
 
-            // ファイルのデータがなくなるまで繰り返す
+            // Lặp lại cho đến khi hết dữ liệu tệp
             for (int k=0; k<loopCount; k++)
             {
                 int touch42 = -1;
                 menu_.GetTouchedNumber(touch42);
                 if (touch42 == 4) break;    // STOP
-                if (touch42 == 2)           // PAUSE ボタンがタッチされた場合の処理
+                if (touch42 == 2)           // PAUSE Xử lý khi chạm vào nút
                 {
-                    menu_.Inactivate(2);    // PAUSE ボタン無効
-                    menu_.Activate(3);      // RESUME ボタン有効
+                    menu_.Inactivate(2);    // PAUSE Nút không hợp lệ
+                    menu_.Activate(3);      // RESUME Đã bật nút
                     mySai_.PauseOut();
 
-                    // PLAY か RESUME か STOP がタッチされるまで待つ
+                    // PLAY Đợi cho đến khi 'RESUME' hoặc 'STOP' được chạm vào
                     switch (WaitTouched())
                     {
-                        case 1: playOk = true;      // 最初から PLAY
+                        case 1: playOk = true;      // PLAY từ đầu
                                 break;
-                        case 3: mySai_.ResumeOut(); // PAUSE 箇所から PLAY 再開
+                        case 3: mySai_.ResumeOut(); // Tiếp tục PLAY từ điểm PAUSE
                                 menu_.Activate(2);
                                 menu_.Inactivate(3);
                                 menu_.TouchedColor(1);
@@ -89,20 +86,20 @@
                 if (playOk || stopOk) break;
 
                 DoIfHandled();
-                // アプリ固有の1ブロック分に対する信号処理(純粋仮想関数)
+               // Xử lý tín hiệu cho một khối dành riêng cho ứng dụng (hàm ảo thuần túy)
                 SignalProcessing();
             }
             mySai_.StopOut();
-            if (!playOk) menu_.Activate(0); // SELECT ボタン有効
-            menu_.Draw(1);                  // PLAY ボタンの色を初期状態にする
-            for (int n=2; n<5; n++)         // その他のボタンは無効
+            if (!playOk) menu_.Activate(0); // SELECT hợp lệ
+            menu_.Draw(1);                  // Khởi tạo màu của nút PLAY
+            for (int n=2; n<5; n++)         // Các nút khác bị vô hiệu hóa
                 menu_.Inactivate(n);
 
-            sdReader_.Close();   // SD のファイルのクローズ
+            sdReader_.Close();   // Đóng tệp SD
         }
     }
 
-    // 選択されたファイル名から拡張子を除いたものを取得
+    // Lấy tên tệp đã chọn mà không cần phần mở rộng
     string SD_PlayerSkeleton::GetFileNameNoExt()
     {
         string fName = fileName_;
@@ -113,7 +110,7 @@
             return fName;
     }
 
-    // SD カードのファイルのオープン
+    // Mở tệp thẻ SD
     int32_t SD_PlayerSkeleton::SD_Open()
     {
         if (fileName_.empty()) SelectFile();
@@ -122,30 +119,30 @@
         return sdReader_.GetSize()/BUFF_SIZE_;
     }
 
-    // ファイルの選択
+    // Lựa chọn tập tin
     void SD_PlayerSkeleton::SelectFile()
     {
         selector_.DisplayFileList();
         title_.Draw("Select file");
-        menu_.Inactivate(0);        // SELECT ボタン無効
-        menu_.Inactivate(1);        // PLAY ボタン無効
+        menu_.Inactivate(0);        // SELECT vô hiệu hóa
+        menu_.Inactivate(1);        // PLAY vô hiệu hóa
         do
             if (selector_.Select(fileName_))
-                menu_.Activate(1);  // PLAY ボタン有効
-        while (!menu_.Touched(1));  // PLAY ボタンがタッチされるまで繰り返す
+                menu_.Activate(1);  // PLAY đã bật
+        while (!menu_.Touched(1));  // PLAY Lặp lại cho đến khi nút được chạm
 
         selector_.Erase(0, 0, BG_LEFT_-4, 272);
         title_.Draw();
     }
 
-    // パネルが操作された場合の処理
+    // Xử lý khi bảng điều khiển được vận hành
     void SD_PlayerSkeleton::DoIfHandled()
     {
         if (reset_ != NULL) reset_->DoIfTouched();
-        Modefy();   // アプリ固有のパラメータ変更(仮想関数)
+        Modefy();   // Ứng dụng thay đổi tham số cụ thể (chức năng ảo)
     }
 
-    // メニューのいずれかのボタンがタッチされるまで DoIfHandled() を実行しながら待つ
+    //Đợi trong khi thực hiện Do IfHandled () cho đến khi bất kỳ nút nào trên menu được chạm vào
     int SD_PlayerSkeleton::WaitTouched()
     {
         int touchNum;
--- a/SD_PlayerSkeleton.hpp	Thu Mar 23 02:58:48 2017 +0000
+++ b/SD_PlayerSkeleton.hpp	Tue Jun 04 21:35:59 2019 +0000
@@ -1,7 +1,3 @@
-//--------------------------------------------------------------
-//  SD プレーヤー用抽象基底クラス(ヘッダ)
-//
-//  2017/03/22, Copyright (c) 2016 MIKAMI, Naoki
 //--------------------------------------------------------------
 
 #ifndef F746_SD_PLAYER_SKELETON_HPP
@@ -19,60 +15,55 @@
     class SD_PlayerSkeleton
     {
     public:
-        // リセット・ボタンを使う場合は resetButton を true とする
+        // Đặt resetButton thành true nếu sử dụng nút reset
         SD_PlayerSkeleton(string str, bool resetButton = false);
         virtual ~SD_PlayerSkeleton() { if (reset_ != NULL) delete reset_; }
-        // SD プレーヤーの処理の実行
+       // thực thi xử lý trình phát SD
         void Execute();
 
     protected:
-        // ボタン用の定数
+       
         static const uint16_t BG_LEFT_ = 414;
         static const uint16_t BG_WIDTH_ = 66;
         static const uint16_t BG_HEIGHT_ = 36;
     
-        const int32_t BUFF_SIZE_;   // バッファのサイズ
-        Array<int16_t> sn_;         // バッファ
+        const int32_t BUFF_SIZE_;   // Kích thước của bộ đệm
+        Array<int16_t> sn_;         // bộ đệm
 
         SaiIO mySai_;
-        SD_WavReader sdReader_; // SD カード読み込み用オブジェクト
+        SD_WavReader sdReader_; // Đối tượng đọc thẻ SD
 
-        // 選択されたファイル名を取得
+        // Lấy tên tệp đã chọn
         string GetFileName() { return fileName_; }
-        // 選択されたファイル名から拡張子を除いたものを取得
+        // Nhận tên tệp đã chọn mà không có phần mở rộng
         string GetFileNameNoExt();
 
     private:
-        string fileName_;       // 選択されたファイル名
-        Label title_;           // 上部に表示されるタイトル
+        string fileName_;       // Tên tệp đã chọn
+        Label title_;           // Tiêu đề hiển thị ở trên cùng
         FileSelector selector_;
         ButtonGroup menu_;
-        ResetButton *reset_;    // リセットボタン用オブジェクトのポインタ
+        ResetButton *reset_;    // Con trỏ cho nut Reset
 
-        // SD カードのファイルのオープン
+        // Mở tệp thẻ SD
         int32_t SD_Open();
-        // ファイルの選択
+       // Chọn tệp
         void SelectFile();
-        // パネルが操作された場合の処理
+      // Xử lý khi bảng điều khiển được vận hành
         void DoIfHandled();
-
-        // メニューのいずれかのボタンがタッチされるまで DoIfHandled() を実行しながら待つ
+// Đợi trong khi thực hiện Do IfHandled () cho đến khi một trong các nút menu được chạm
         int WaitTouched();
 
-        // コピー・コンストラクタとオブジェクトの代入演算子は使用禁止
+       // Không sử dụng hàm tạo sao chép và toán tử gán đối tượng
         SD_PlayerSkeleton(const SD_PlayerSkeleton&);
         SD_PlayerSkeleton& operator=(const SD_PlayerSkeleton&);
 
-        //-------------------------------------
-        //      以下は仮想関数
-        //-------------------------------------
-        // 1ブロック分の信号処理
         virtual void SignalProcessing() = 0;
-        // 信号処理のパラメータ変更など
+        // Thay đổi tham số xử lý tín hiệu, v.v.
         virtual void Modefy() {}
-        // 曲の再生時の表示
+       // Hiển thị khi phát một bài hát
         virtual void Display() {}
-        // 信号処理で必要になるクリア処理
+        // *Xóa quá trình cần thiết để xử lý tín hiệu*//
         virtual void Clear() {}
     };
 }
--- a/SD_WavReader.cpp	Thu Mar 23 02:58:48 2017 +0000
+++ b/SD_WavReader.cpp	Tue Jun 04 21:35:59 2019 +0000
@@ -1,11 +1,3 @@
-//--------------------------------------------------------------
-//  SD_WavReader class
-//      SD カードの *.wav ファイルの内容を読み出す
-//      以下の型式のファイルのみ扱う
-//          PCM,16 ビットステレオ,標本化周波数 44.1 kHz
-//
-//  2017/03/22, Copyright (c) 2017 MIKAMI, Naoki
-//--------------------------------------------------------------
 
 #include "SD_WavReader.hpp"
 
@@ -29,29 +21,29 @@
     {
         string name = (string)"/" + STR_ + "/" + fileName;
         fp_ = fopen(name.c_str(), "rb");
-        if (fp_ == NULL) ErrorMsg("open error!!");
+        if (fp_ == NULL) ErrorMsg("Loi The SD!!!");
     }
     
     
-    // ファイルのヘッダ "RIFFxxxxWAVEfmt " の部分の読み込み
-    //      戻り値:16 ビットステレオ,標本化周波数が 44.1 kHz の場合 true
+    // Đọc một phần của tiêu đề tệp "RIFFxxxxWAVEfmt"
+    // Giá trị trả về: true nếu âm thanh nổi 16 bit, tần số lấy mẫu là 44,1 kHz
     bool SD_WavReader::IsWavFile()
     {
         char data[17];
-        fread(data, 1, 16, fp_);    // 16 バイト分を読み込む
+        fread(data, 1, 16, fp_);    // Đọc 16 byte
         string strRead = "";
         for (int n=0; n<4; n++) strRead += data[n];
-        // 間の 4 文字はチェックしない
+        // Không kiểm tra 4 ký tự giữa 
         for (int n=8; n<16; n++) strRead += data[n];
 
-        // "RIFF", "WAVE", "fmt " が存在することを確認
+        // Kiểm tra xem "RIFF", "WAVE", "fmt" có tồn tại không
         if (strRead != "RIFFWAVEfmt ") return false;
 
-        // fmt chunck のサイズを取得
+        // có được kích thước của fmt chunck
         uint32_t fmtChunkSize;
         fread(&fmtChunkSize, sizeof(uint32_t), 1, fp_);
 
-        // PCM, Stereo, 44.1 kHz, 16 bit であることを確認
+        // Xác nhận rằng đó là PCM, Stereo, 44.1 kHz, 16 bit
         WaveFormatEx fmtData;
         fread(&fmtData, fmtChunkSize, 1, fp_);
         if ((fmtData.wFormatTag     != 1)   ||
@@ -60,7 +52,7 @@
             (fmtData.wBitsPerSample != 16)
            ) return false;
 
-        // data chunk を探す
+        // Tìm dữ liệu
         char dataId[5];
         dataId[4] = 0;
         fread(dataId, 1, 4, fp_);
@@ -77,7 +69,7 @@
                 if (n == 99) return false;
             }
 
-        // データサイズ (byte) を取得
+        // Nhận kích thước dữ liệu (byte)
         int32_t sizeByte;
         fread(&sizeByte, sizeof(int32_t), 1, fp_);
         size_ = sizeByte/4;
@@ -86,7 +78,7 @@
         return true;
     }
 
-    // ファイルからステレオデータの取得
+    // Nhận dữ liệu âm thanh nổi từ tập tin
     void SD_WavReader::ReadStereo(Array<int16_t>& dataL,
                                   Array<int16_t>& dataR)
     {
@@ -100,7 +92,7 @@
         }
     }
 
-    // ファイルからデータをモノラルに変換しての取得
+    // Chuyển đổi dữ liệu từ tập tin sang đơn âm
     void SD_WavReader::ReadAndToMono(Array<int16_t>& data)
     {
         if (!ok_) ErrorMsg("Get data FAILED");
@@ -110,7 +102,7 @@
             data[n] = (buffer[2*n] + buffer[2*n+1])/2;
     }        
     
-    // データサイズ(標本化点の数)の取得
+    // Thu thập kích thước dữ liệu (số điểm lấy mẫu)
     int32_t SD_WavReader::GetSize()
     {
         if (!ok_) ErrorMsg("Get data size FAILED");
--- a/SD_WavReader.hpp	Thu Mar 23 02:58:48 2017 +0000
+++ b/SD_WavReader.hpp	Tue Jun 04 21:35:59 2019 +0000
@@ -1,10 +1,4 @@
-//--------------------------------------------------------------
-//  SD_WavReader class ---- Header
-//      SD カードの *.wav ファイルの内容を読み出す
-//      以下の型式のファイルのみ扱う
-//          PCM,16 ビットステレオ,標本化周波数 44.1 kHz
-//
-//  2017/03/22, Copyright (c) 2017 MIKAMI, Naoki
+
 //--------------------------------------------------------------
 
 #ifndef SD_WAV_READER_HPP
@@ -28,16 +22,16 @@
         
         void Close() { fclose(fp_); }
         
-        // ファイルのヘッダ読み込み
+      // Đọc tiêu đề của tệp
         bool IsWavFile();
 
-        // ファイルからステレオデータの取得
+      // Nhận dữ liệu âm thanh nổi từ tệp
         void ReadStereo(Array<int16_t>& dataL, Array<int16_t>& dataR);
 
-        // ファイルからデータをモノラルに変換しての取得
+        // Chuyển đổi dữ liệu từ tệp thành đơn âm
         void ReadAndToMono(Array<int16_t>& data);
         
-        // データサイズ(標本化点の数)の取得
+      // Lấy kích thước dữ liệu (số điểm lấy mẫu)
         int32_t GetSize();
 
     private:
@@ -46,25 +40,24 @@
         struct WaveFormatEx
         {
             uint16_t wFormatTag;        // 1: PCM
-            uint16_t nChannels;         // 1:モノラル,2: ステレオ
-            uint32_t nSamplesPerSec;    // 標本化周波数 (Hz)
-            uint32_t nAvgBytesPerSec;   // 転送速度 (bytes/s)
-            uint16_t nBlockAlign;       // 4: 16ビットステレオの場合
-            uint16_t wBitsPerSample;    // データのビット数,8 または 16
-            uint16_t cbSize;            // PCM の場合使わない
+            uint16_t nChannels;        // 1: 1: đơn âm, 2: âm thanh nổi
+            uint32_t nSamplesPerSec;    // Tần số lấy mẫu (Hz)
+            uint32_t nAvgBytesPerSec;   // Tốc độ truyền (byte / s)
+            uint16_t nBlockAlign;       // 4: Trong trường hợp âm thanh nổi 16 bit
+            uint16_t wBitsPerSample;    // Số bit dữ liệu, 8 hoặc 16
+            uint16_t cbSize;            // Không được sử dụng cho PCM
         };
 
         SDFileSystem *sd_;
         FILE *fp_;
         
         bool ok_;
-        int32_t size_;          // データサイズ(標本化点の数)
-        Array<int16_t> buffer;  // 作業領域
+        int32_t size_;          // Kích thước dữ liệu (số điểm lấy mẫu)
+        Array<int16_t> buffer;  // Khu vực làm việc
         
         void ErrorMsg(char msg[])
         {   BlinkLabel errLabel(240, 100, msg, Label::CENTER); }
-
-        // コピー・コンストラクタとオブジェクトの代入演算子は使用禁止
+// Không sử dụng hàm tạo sao chép và toán tử gán đối tượng
         SD_WavReader(const SD_WavReader&);
         SD_WavReader& operator=(const SD_WavReader&);
     };