amo / bring me the horizon

f:id:grasstech:20190125033916p:plain

CDが発売される前にアルバムの曲からデジタル配信が始まっていて。

MANTRAは最初にシングルとして出されたので、対象外でしたが、
wonderful life (feat. Dani Filth)以降はアルバムからのシングルカットで、
先行配信の曲を買っていくと残りの金額でコンプリートできるという仕組みでした。

YouTubeにもその曲のPVがアップされたりして。

こういったプロモーションの新しい音楽の楽しみ方だと思いました。

そして、配信日の25日。日本は世界の中ではかなり早い方の解禁。
オーストラリアが対象ならそちらの方が早いかな?

早速聴いていますが、様々な音楽を試していて、
YouTubeのコメ欄にあるような、賛否両論があるのがわかる内容になっています。
自分はジャンルにはあまりこだわりがないので全然良いんですが、
こういった雑食の人は珍しいのかもしれませんね。
ただ、どの曲も曲としてのクオリティは高いのが面白くて。

このアルバムのドラマチックなところは、mother tongue(母国語)という名前がついた曲で。
この曲でサビにamoという言葉が本当に効果的に使われていて、
そしてこれがラブソングというのがまた良いですね。

MUCOM88 for Android

久々にAndroidアプリを作ってみました。
バグや気になる部分が多すぎるけど、休みが明けてしまうのでそのままリリースします。

Android 4.0以降への対応です。
SDカードの読み書き権限が必要です。
野良アプリですので、取扱に注意してください。

使用方法
1. 曲ファイルを選択する。
2. 必要であればPCMファイルを選択する。
3. PLAYボタンを押す。

http://grasstech.s1007.xrea.com/extra/mucom88_android_190105.apk

2019/01/06
更新しました。動作が安定しました。
http://grasstech.s1007.xrea.com/extra/mucom88_android_190106.apk

2019/01/06 21時
再び更新しました。
バックグラウンド再生が安定しない不具合を修正しました。
http://grasstech.s1007.xrea.com/extra/mucom88_android_190106_01.apk

M5Stackで音付きアニメーションを試す(一部ソース付き)

M5Stackで遊んでみました。

元ネタはこれです。


続いてコードを…。

#include <M5Stack.h>
#include <WiFi.h>
#include "AudioFileSourceSD.h"
#include "AudioFileSourceID3.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"

extern const unsigned char p1[];
extern const unsigned char p2[];

AudioGeneratorMP3 *mp3;
AudioFileSourceSD *file;
AudioOutputI2S *out;
AudioFileSourceID3 *id3;

void setup() {
  M5.begin();
  WiFi.mode(WIFI_OFF); 

  M5.Lcd.printf("M5STACK BOOT...\n");

  file = new AudioFileSourceSD("/song.mp3");
  id3 = new AudioFileSourceID3(file);
  out = new AudioOutputI2S(0, 1); // Output to builtInDAC
  out->SetOutputModeMono(true);
  out->SetGain(0.10);
  mp3 = new AudioGeneratorMP3();
  mp3->begin(id3, out);
  M5.Lcd.printf("GO\n");
}

bool Play = false;
bool Graph = false;
bool Page = false;
bool Anime = false;
unsigned long NextFrame = 0;

void DoAnime() {
     if (!Page) {
         M5.Lcd.drawBitmap(0, 0, 320, 240, (uint16_t *)p1);      
     } else {
         M5.Lcd.drawBitmap(0, 0, 320, 240, (uint16_t *)p2);  
     }
     Page = !Page;
}

void loop() {
   if (Play) {
    if (mp3->isRunning()) {
      if (!mp3->loop()) mp3->stop();
    }
   }
   
   if (Anime) {
    unsigned long ms = millis();
     if (NextFrame < ms) {
        DoAnime();      
        NextFrame = ms + 500;
     } 
   }

  if(M5.BtnA.wasPressed()){
     Play = true;
  }
  if (M5.BtnB.wasPressed()) {
     Anime=true;
  }
  if (M5.BtnC.wasPressed()) {
     Play=true;
     Anime=true;
  }
  
  M5.update();  
}

画像はコンバートしたものを使用していて、別ソースなので省略です。

ここにあるようにフォーマット的には16bit RGB565なのですが、リトルエンディアンでした。
エクスポート後に手動でstaticの削除、配列名の変更、ファイル末尾の構造体(だったかな?)の削除をしました。

  • 完全なバックグラウンド再生ではないようで、mp3->isRunning()を呼ばないと音が更新されなくなりました。
  • M5.update()を呼ばないとキー入力が更新されなくなりました。

M5Stackはいろいろ組み合わせて気軽に作れるのが良いかもしれません。