ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

C++ でいう bind を python でやりたい

C++

using std::function;
using std::bind;
using namespace std::placeholders;

// 引数を3つ受け取る関数
void someFunction(int a, int b, int c)
{
  ...
};

int main()
{
  // someFunction に値を束縛してクロージャを作って
  auto closure = bind(&someFunction, _1, 0xB, _2);

  // それを呼び出す
  closure(0xA, 0xC); // somFunction(0xA, 0xB, 0xC) と等価
}

これと同様の事を python でもやりたい。

python(partial 使う)

from functools import partial

# 引数を3つ受け取る関数
def  someFunction(a, b, c):
  ...

if __name__ == '__main__':
  # someFunction に値を束縛してクロージャを作って
  closure = partial(someFunction, b=0xB)

  # それを呼び出す
  closure(0xA, 0xC) # somFunction(0xA, 0xB, 0xC) と等価

python(lambda 使う)

if __name__ == '__main__':
  # ラムダでなんとかする
  closure = lambda a, c: someFunction(a, 0xB, c)

  # それを呼び出す
  closure(0xA, 0xC) # somFunction(0xA, 0xB, 0xC) と等価

感想

DTMしたい…

合作用にバイナリファイル同期環境を構築する

この記事は

DTM の合作でプロジェクトデータをやり取りするのにイチイチ SNS やらなにやらでやり取りするのが嫌だったのでサーバー借りて subversion 入れて…て感じで環境を作った時のメモです。

作業手順の解説の前に

前提とか

  • バイナリファイルのやり取りを簡単にしたい
    • git で言う所の pull / push の手間を簡略化したい
    • やり取りの手間を億劫にしたくない
  • バージョン管理したい
    • 万が一手順をミスってファイルを喪失してもリカバリが効くようにしたい
    • ちょっと実験してみて気に入らなかった時にロールバックできるようにしたい
  • 複雑なバージョン管理は想定しない
    • 作業のコンフリクトは諦める(というかマージのしようがない)
    • お行儀よく交互に作業する事を前提とする
    • せいぜい2~3人程度のルール尊守を徹底できる規模しか考えない
  • 合作以外の個人作業にも流用したい
    • 上記のメリットを個人作業にも使いまわしたい

おおまかな流れ

  • 適当にサーバー借りてくる
  • サーバー上で subversion のサービス動かす
  • 各個人のマシンに tortois-svn を入れる

サーバー側の環境構築

さくらレンタルサーバーを借りる

まずは ssh ログイン環境を整える

  • 作業マシンは windows 10 なので bash on ubuntu on windows 上で何とかする
  • ssh-keygen で鍵作って公開鍵サーバーに送ってローカルで ~/.ssh/config 書く
    • めんどいので詳細は省略(参考にしたページ忘れてしまった…)
  • ついでなのでクソうるさいエラー音を黙らせておく

bash に変える

subversion をインストール

  • pkg は使えない
    • 共有サーバーだから sudo 権限無いんですねこれ…
    • ということでソースから自分でビルドして $HOME 以下に入れる

結局打ち込んだコマンド

cd
mkdir src
cd src
wget http://ftp.kddilabs.jp/infosystems/apache/subversion/subversion-1.9.7.tar.bz2
tar xf subversion-1.9.7.tar.bz2
cd subversion-1.9.7
./configure --prefix=$HOME/local/subversion
gmake
gmake install

tortoise-svn からの接続用にバイナリのリンクを貼る

クライアント側の環境構築

tortoise-svn をインストールする

秘密鍵を変換

  • bash on windows 上で作った鍵はそのままだと TortoiseSVN に渡せないので putty 用の形式に変換する
    • bash on windows 上で apt-getputty 入れて puttykeygen で鍵を変換する
    • putty 秘密鍵~/.ssh/id_rsa.ppk に置いておく
  • 参考

tortoise-svnssh 設定する

  • windowsエクスプローラー開いて適当な所で右クリックして「TortoiseSVN > Settings」
  • 設定窓が開くので左側のツリーで「ネットワーク」を選択
  • SSH Client:」のテキストボックスを埋める
  • "C:\Program Files\TortoiseSVN\bin\TortoisePlink.exe" -l <user name> -i <putty private key>
  • <putty private key> の場所は windows 上だと C:\Users\<USERNAME>\AppData\Local\lxss\home\<USERNAME>\.ssh\id_rsa.ppk
  • 秘密鍵の場所はすっっごい間違えやすいのでエクスプローラーのアドレスバー上でサジェストしてもらいながらパスを組み立ててそれをコピペすると無難(特にユーザー名が1つめと2つめで違うのが罠)

接続テスト

cd
mkdir svn
cd svn
svnadmin create <REPONAME>
  • クライアント側でリポジトリを閲覧
    • TortoiseSVN を開いて Repo-browser を選択
    • URL に svn+ssh://<USERNAME>.sakura.ne.jp/home/<USERNAME>/svn/<REPONAME> を入れて OK
    • パスワードやユーザー名の入力を要求されずにエラーメッセージも出ずにそれっぽいウィンドウが出てくれば疎通確認は OK
    • エラー出てきたりパスワード要求されたりするばあいは何処かで設定を間違えている(デバッグ情報に乏しいので間違い探しがかなりしんどい)

作業の相手にやってもらう作業リストのテンプレ

TortoiseSVN をインストール

TortoiseSVNssh 接続設定

  • 予め送ってある秘密鍵(id_rsa.ppk)を C:\Program Files\TortoiseSVN に配置
  • エクスプローラ上の適当な場所で右クリックして「TortoiseSVN > Settings」
  • 左側のツリー内の「Network」をクリック
  • SSH」内のテキストボックスに以下の文字列をコピペ "C:\Program Files\TortoiseSVN\bin\TortoisePlink.exe" -l <USERNAME> -i "C:\Program Files\TortoiseSVN\id_rsa.ppk"

作業用コピーをダウンロード

  • 作業に使うフォルダをエクスプローラで開く
  • 適当な所で右クリック > SVN Checkout
  • 「URL of repository:」に svn+ssh://<USERNAME>.sakura.ne.jp/home/<USERNAME>/svn/<REPONAME> をコピペ
  • OK をクリック
  • プロジェクトファイル一式が展開されれば問題なし

作業内容をサーバーから受け取る

  • プロジェクトファイルの入っているフォルダ上で「右クリック > SVN Update」

作業内容をサーバーに送る

  • FL Studio 上で
    • 「FILE > Export > Project Data Files...」で .flp と同じフォルダ上にデータを出力
  • プロジェクトファイルの入っているフォルダ上
    • 「右クリック > SVN Commit...」
    • Message: に変更内容やら申し送りやらをコメントに記入
    • Changes made(double-click on file for diff): のリストボックス内のチェックをすべていれる
    • OK をクリック

感想

アズールレーンたのしい

DTM してたとおもったらいつのまにか python コード書いてた話

この記事は TUT Advent Calendar 2017 の 9 日目の記事です

adventar.org

前日は maggyotomo 氏の雑記帳 — 乗り鉄拠点としての豊橋の優位性です。 切符のはなしは普通に有益なライフハックだと思った。 突然弊社フロアが爆発消失して旅に出たくなる時が来たら参考にしますね。

話を始める前に

僕OBだし流石に今年はいいかな~~~~~とか思ってたんですけど、思いの外枠が埋まってなくてピンチらしいっていう話を聞いて急遽ブッこみました。

内容的にはここ一年ダラダラ取り組んでやっと解決したベース音の位相の微調整の話です。 「本人はめっちゃ頑張って調整したけど他人には全然分からない」系の話です。 内容的にはかなり地味。

(ちなみに間に合ってしまったのでメイドさん写真集は)キャンセルだ。

はじめに

とりあえずこれを聴いてほしい。

※解説用にベース波形を本来のものから差し替えてます&普通に未公開トラックなので正式リリース時にはまたちょっと変わってるよ。

前半が補正前、後半が補正後です。 前半はなんだかリズム感がヨレヨレですが、後半はそれがかなり緩和されているのがわかります。 特に、一番高いベース音の時、のズコーって感じがマシになってます。 君はこの微妙な違いを感じ取れる、いいね?

自分で聞いてて本当に改善してるのかわかんなくなってきたゾ。

ということで、このヨレヨレの原因と解決法を説明していきます。

原因を説明する前に…

前提知識をお話していきます。

まず、今回取り扱うのは UK Hardcore という音楽ジャンルでの「ベース」についてです。 UK Hardcore って言うのはこんな感じのジャンルです。

キックとベースがひたすら交互に鳴ってますね。 最近では正常な人間が聞くタイプの音楽では無いと囁かれています。

この UK Hardcore はクラブミュージックなので低音域を担うキックとベースの作り込みでノリのほとんどが決定します。 「低音=身体にズンドコ来る帯域」で、このズンドコ来る帯域を鳴らすのはキックとベースだけなので、ノリを支配してても全く不思議じゃないですね。

んで、このキックとべースの「キック→ベースの切り替わり」の部分に話をフォーカスします。 切り替わり部分の処理の仕方はいろいろあるんですが、僕は今のところ「キックがスパッと止まってベースがスパッと入ってくる」を採用しています。 EDM を BPM 170 に早回しした感じの UK Hardcore でよくある「良い感じにキックとベースがクロスフェードする」も大変よろしいんですが、こっちは今回のお話では取り扱いません。

最初に結果として示した曲もこのスパっと切り替わるタイプの作り方をしています。 このスパっと切り替わるキック&ベースのうちベースの方の涙ぐましい調整についてお話していきます。

何が原因でヨレヨレになるのか?

まずはこちらを御覧ください

f:id:NU_Pan:20171209215800p:plain

左側半分はキックの波形、右側半分はベースの波形です。 つまり「1拍」分の波形を可視化したものです。

さて、この画像の波形を人間が聞いた時、初めて「鳴った」と感じるタイミングをマークすると…

f:id:NU_Pan:20171209221904p:plain

キックは「まさに表拍の頭ちょうど」にアタックを感じますが、ベースは「裏拍の頭からちょっと遅れて」アタックを感じます。 何故かと言うと、ベース(というかノコギリ波)は鳴り始めたと感じるタイミング(アタックといいます)が「最初にガケが来たタイミング」に来るからなんです。

勘違いしてはいけないのは、ここまではそれほど大きな問題ではないということです。 もともと意図していた「アタック感がほしいタイミング」は裏拍の頭なので、「期待するものと実際のものがズレている」という点では良くないのは確かなんです。 ですが、別に人間の聞こえ方・感じ方として何も問題がないのなら、それは全くなんの問題でも無いんです(最終的に信じるべきは自分の耳や感覚です)。 実際、音程が一定なら違和感を感じることはなかったので、遅れること自体は``ここまでは''問題無いです。

ところがです、ベースの音程が変わると…

f:id:NU_Pan:20171209220612p:plain f:id:NU_Pan:20171209220626p:plain

ああ、音程によってアタックのタイミングが変わってしまっている…。

そう、これが全ての元凶です。 例示した曲はベースの音程がコロコロ変わるので、音程が変わる度にアタックのタイミングが変わってしまうのです。 タイミングが変わればノリが変わってしまいます。 つまり、2回か4回ベース音を聞いてノリを捕まえたと思ったら、すぐにノリが変わってしまうのです。 そりゃぁ気持ち良い訳がない。

どうなればヨレヨレにならないのか?

もちろん「ノコギリ波のガケが裏拍の頭丁度に来るようにする」のが解決法です。 とにかくこの1点に尽きます。

こんな感じになればいんです

f:id:NU_Pan:20171209221627p:plain

が、コレを実現するのは意外と簡単ではありません…。

ダメだった : シンセの開始位相設定をいじる(1)

実は問題のベース音、実は開始位相タイミングが 180 度になっています。 つまり「ノートオンの瞬間にノコギリ波のガケが来る」のではなくて「ノートオンの瞬間にノコギリ波のガケとガケの間の中間地点が来る」なんです。 なので、開始位相タイミングを 0 度にして前者の状態にするだけで解決するといえば解決します。

しかし、この解決法だと、ベースの立ち上がりに「プチッ」という音楽的にはよろしくない感じのノイズが入ってしまいます。 また、ベースのアタックの鋭さを自由に調整出来ません(アタックをゆるくすると初回のガケがなくなってしまいます)。 なのでこの解決法は無し。

ダメだった : シンセの開始位相設定をいじる(2)

モダン…というかいろいろできるタイプのシンセだと「どの音程を鳴らす時は発音をこのくらい遅らせる」みたいな設定が出来ます。 こういう、音程に応じて設定をいじる系をキー・マップとか言います。 YAMAHA DX7 の頃からある由緒正しいモジュレーション機能です。

が、コレもナシです…。 発音のディレイタイムにキーマップ出来ないシンセにはこの手使えないからね、しょうがないね。 シンセの選択肢はできるだけ狭めたくないです。

ダメだった : ベースの音程を進行させない

音程が一定ならそりゃタイミングがズレることもないですし、使う音程を2~3個程度に絞れば手作業でシンセの位相設定を微調整するのも現実的です。 この方法は「物理的な低音の鳴り方の問題を避ける」意味でも有効です。 音響にかなりしっかり力を入れてる所だとまんべんなく良い感じに鳴ってくれるのでそこまで気にすることは無いのですが、並の環境だと 60 Hz から 80Hz の間だけものすごいパワーを発揮してこの周波数帯を外れた瞬間に突然パワーダウンするとかザラです。 コード進行をしなければ「大抵の環境で良い感じに鳴る音程だけ使う」という真似が出来ます。 なので、キックとベースでズンドコしまくる頭悪い感じのドロップ系 UK Hardcore はコード進行なんてしないですし、Mainstream Hardcore に至ってはベースが居ないようなものですし、UK Hardcore でも音程を進行させるとしても、 III -> IV -> V の王道進行とかの結構狭い範囲で収めます。

しかし、この解決法もナシです。 コード進行したほうがエモく尊くなるからね、しょうがないね。 (歌モノ Mainstream Hardcore はエモいけどそれはまぁ別のお話ってことで)

結局どうしたのか

python でオフライン信号処理書きました(半ギレ)。 ベース音を音程ごとに wav ファイルに吐いて、それを python で書いたプログラムに食わせて補正済みの wav ファイルを出力して、それをまた DAW に食わせる…みたいなワークフローにしました。 なんだか結構限定的なシチュエーションでしか上手く動かない感じになっちゃったけど、そもそも自分発のニッチな需要を満たすためのプログラムだし、ままええやろ。

アルゴリズム

一応、工学系の大学の AC なのでアルゴリズムも簡単に触れておきます。

基本的には

  • ノコギリ波の「ガケ」位置を検出
  • ガケ位置情報を元に周期(=周波数)を推定
  • 推定した周期を元に上手く検出できなかった「ガケ」を復元
  • 検出した「ガケ」のうち音声波形先頭側の適当なものを選択
  • 選択した「ガケ」が「音声ファイル先頭からある一定のタイミング」に来るように波形をシフト

って感じです。 認識系タスクで有りがちな結構泥臭いことをやってます。 音声信号処理は履修してないのでかなりアホな事をやっているかもしれません。 じぶんなりにがんばりました(精一杯の強がり)。

「ガケ」が「ある遅れた一定のタイミング」に来ることになるので、DAW 側ではそれを織り込んで普通よりも少し早めにノートオンします。 具体的にはノートオンのタイミングを 1/128(128分音符)だけ早い方にずらします。 少し早く鳴らすので、ノートオンから「ガケ」が来るまでの間の区間はキックとベースのクロスフェードに使えます。 クロスフェードできるので、波形をバッサリ切り落としてブチッってなるアレを回避できます。

プログラム

かなりグダグダなので正直あんまり公開したくないけどこちらになります。

第三者が使えるように整備とか全然してないです。 ていうか波形によっては補正失敗して落ちます。 正直自分が使えていて問題を解決できていればそれで目的は達成しているので、第三者が使えるようにするモチベーションが存在しないんすよね…。 もしいろいろ整備しだしたらそれはきっと僕が失職したときでしょう。

ちなみに…

わかりやすくするために、実際にあった紆余曲折を全て端折っています。 実際には色々検証して知見を溜めつつこの結果に行き着きました。 スッゲーキツかったゾー。

明日

T_T3_M5 氏の「歴代ハマった音楽たち(2013~).」です。 ぼくも音楽遍歴系のネタにすればよかったと今凄く後悔してます。

おまけ : DREAMING WITH YOU の話

最初に例として出した曲の事です。 この曲のコード進行というかベースの動く範囲があまりにも自由すぎて今回お話した問題が顕在化して、解決を余儀なくされました。

この曲「はー、嫁クソかわいいし尊いししぬほどエモいわ。はーーーーーー。」って言いながら作った曲です。 作詞が難産で地獄だった。 ほぼ一夜漬けでなんとかした版(NIGHTLY 版)がテクノ部から出てるからみんな聞いてね! でも NIGHTLY HARDCORE VIP はベースが 💩 of 💩 だから聞いてほしくないよ!

URL 貼って気づいたけど、フルレングスの視聴出来なくて草。 テクノ部関係者に ONDISK の真似して「俺にも回してくださいよぉ」って言えば形式上の抵抗をした上で融通してくれそう。 (そもそも僕に直接コンタクトくれれば音源送りますけどね…)

なお、もしこの記事が間に合ってなかった場合は嫁との思い出の写真を10枚くらい選んで貼ってお茶を濁していたと思います。 こんな感じで

バックアップページ作りました

音源のバックアップを dropbox に集約しました。 soundloud 終わる終わる詐欺にやられました。

www.dropbox.com

バックアップページなので、閲覧性はゼロです。 各楽曲をプレビューしたい時は soundcloud とかに行ってください。 あと mp3 タグとかアートワークとかは全然手を付けてないです(めんどくさい)

FL Studio で Waves のプラグインをロードできなかった話

この記事は

FL Studio 12.5 で Waves 9.91 系のプラグインをロードしようとすると、謎いエラーでロードできなかった時の顛末をまとめたものです。 一応の解決はしましたが、正しい解決法ではない気がします。

ハマった環境

遭遇した事態

  • 至って普通の方法で waves プラグインをインストール(EASY INSTALL & ACTIVATE)
  • FL 上で ManagePlugin からスキャンをかけて F チェックを入れる(トラブルシューティングなので Scan options は全部入れといた方が良い)
  • ミキサーのチャンネルラックから右クリックで所望のプラグインを選択
  • Something went wrong loading the VST3 plugin WaveShell-VST3 9.91. Please make sure it's installed and registered properly.

解決法

FL を管理者として実行する。 「管理者権限持ちのユーザーが普通に実行」ではダメで「管理者として実行」でないとダメ。

FL の実行ファイルのプロパティ開いて常に管理者として実行にすればいいと思う。

懸念点

管理者として実行した場合、出力されるファイルのアクセス権ってどうなるんでしょうね…?

感想

IL のフォーラム漁ったけど解決法に至らなくて、まさかね、と思って管理者実行したらドンピシャだった。 Waves ゆるせない。

※追記(2018/01/04)

DTM 環境をレストアしてる時に気づいたんですが、 C:\Users\Public\Waves Audio のアクセス権が存在しない状態だとプラグインのロードに失敗するっぽいです。 一度でも Waves Audio フォルダをエクスプローラーから開くと永続的にアクセス権が付与されて、それ以降は FL を非管理者で実行しても問題ありません。 管理者権限で云々という問題だったから権限の無いフォルダを触ってるんだろうなとは思っていたけど、まさか権限に問題がなさそうな public 以下だったとは…。

フツーの DAW 上で行うゼロ位相フィルタリング

この記事は

いたって普通な DAW 上でゼロ位相フィルタリングを行う方法の紹介記事です。


フィルタとか位相とか何の話?

フィルターは EQ 全般だと思ってください。 典型的にはローパスフィルタとかハイパスフィルタとかの事を指しますが、EQ でよくあるピーキング(特定の周波数帯だけを上げ下げする)もフィルタの一種です。 以下全部、特定の周波数帯をゴニョゴニョする時のお話です。

で、位相と言うのはココでは音の遅れの事を指します。 ただ、遅れと言っても「波形が300ミリ秒遅れる」みたいな話ではなくて「波形が崩れる」という話です。

位相とか波形が崩れるとか何言ってんの?

まず、位相というのは「一定周期で繰り返すような音」の「遅れ」を「ディグリー(度)」で表したものです。 0 [deg] なら遅れなし、180 [deg] なら波形のちょうど半分だけズレる、360 [deg] なら一周まわって遅れてないように見える、って感じです。 今言ったのは「波形全体がまるごと XXX [deg] 分だけ遅れた」時の事を指します。

ところで、波形に EQ をかけると、この位相の遅れは発生します。 周波数ごとに遅れ方が異なりますが。 例えば、ローパスフィルタの場合なら、カットオフ周波数よりも高い周波数の帯域は位相が(あんまり)遅れませんが、カットオフ周波数よりも低い周波数帯になると周波数の低さに比例して位相の遅れが大きくなります。 こういう、フィルターの「周波数による位相の遅れ具合」のことを位相特性とか呼んだりします。

さて、この位相特性によっては周波数帯によって音が遅れたり遅れなかったりするので、そんなことをすれば当然波形が崩れます。 こうやって、位相特性によって波形が崩れる事を位相がおかしいだの崩れるだのと言ったりします。 例えば、ある波形にローパスフィルタをかけた場合、位相が崩れていなければ、単純に元波形のピークを落として滑らかにしたような波形が出てきますが、位相が崩れると波形のピークのいちが変わります。 もっと露骨な例で言えば、純粋なノコギリ波は完全に位相が揃った状態なのですが、倍音成分の位相だけをランダマイズするとノイズみたいな波形になり(sytrus なんかの加算合成シンセだと簡単に再現出来ます)、聴感上でもなんだかノイズっぽい音になります。

結局ゼロ位相フィルタとは

なので、基本的には位相が崩れるのは(意図してなければ)あまりうれしくないわけです。 できれば位相が変化せず、振幅だけが変化するフィルタがほしいわけです。こういうフィルタの事をゼロ位相フィルタと言います。

線形位相フィルタ

ゼロ位相ではありませんが「波形の形を保ったまま波形全体が遅れる」みたいなフィルタもあります。 こいうフィルタの事を線形位相フィルタといいます。 位相特性をプロットした時に直線が出て来るので線形位相って言います。 なんで線形位相なら波形が崩れないのか? みたいな話は、実際に試してみるとたしかにそうなります(暇な人はやってみよう!)

波形全体が遅れるのなら、遅れた分を補正すればゼロ位相じゃん! っていうやり方も出来ますが、世の中の線形位相 EQ はどういうわけかカットオフがゆるいです。 特定周波数でシュッとカットオフとか苦手です。 うーん困った。

どうやってゼロ位相フィルタリングするのか

ということで本当に位相の遅れが発生しないフィルタリングの方法の紹介です。

  • 元波形を A とします
  • 波形 A に EQ を普通にかけます(波形 B)
  • 波形 B をリバースします(逆再生です、波形 C)
  • 波形 C に もっかい EQ をかけます(波形 D)
  • 波形 D をリバースします

おめでとうございます! これでゼロ位相フィルタの完成です! 原理は本当にめちゃくちゃ簡単で「位相が遅れるんなら逆再生にして同じだけ遅らせれば良いじゃない!」ってことです。

元ネタは

scipy.signa.filtfilt()関数です。 これ最初見た時全く意味がわからなかったんですが、ある日突然意図に気づきました。

弱点

  • フィルタの2回重ねがけを強要されます。
    • 注意したいのは、例えば「-12dB/Oct のローパスフィルタを2回」=「-24dB/Oct のローパスフィルタを1回」は等価ではないです。
    • 大体似たような振幅特性になるのですが等価ではないので注意が必要です。
    • このあたりの解説はリンクウィッツ・ライリーフィルタを調べるとわかります。
      • ちなみに、リンクウィッツ・ライリーフィルタは同じフィルタを2回かける手法なので、このゼロ位相フィルタリングと相性が良いです。
      • そしてリンクウィッツ・ライリーフィルタはクロスオーバーに使われます。
      • つまり、位相を崩さずに、キレの良いマルチバンド処理ができます
  • リアルタイム処理は出来ません
    • 波形をリバース出来ないといけないので、録音済みの波形にしか適用出来ません。
  • 因果関係が崩れます
    • 例えば、スネアの音にこの方法を適用すると、なりはじめの前の無音部分に影響が発生します
    • つまり、未来の音が過去に影響を与えてしまいます!
  • 単純にめんどくさい
    • EQかけてリバースして…なんてぶっちゃけイチイチやってられない…

感想

こんな簡単なことにも気付かなかったなんて(KNN)

Markdown で書けるらしいっすね

たとえば

こんな感じに書ける。 連続する行は一行にまとめられる。 おのれアルファベット圏。

一行離せば改行される。

これはトップレベルの見出しで

これは一個深いレベルの見出しです

はてな記法で最高レベルの見出し使うと別記事扱いされた気がしますね?

レベル3

レベル4

見出しのレベルの違いわかりづらくね? CSS でカスタマイズしろってことか?

箇条書き

  • たとえば
  • こんなふううに
  • 箇条書き
  • ブラウザ上だと
    • タブ入力出来ないし
    • vscode とかで編集するのが前提かも

リンクだって貼れる

markdown 標準

ぬうぱんの備忘録

はてな記法も使える…?

nu-pan.hatenablog.com

センタリングは当然 html タグの div を使う

LaTeX の数式は?

<pre> [tex:{ y = ax2 + b2 }] </pre>

{
y = ax^2 + b^2
}

vscode 拡張の markdown tex 記法と互換性ないし type 数多くてしんどい。 $ 記号でくくりたい。

そのほか

markdown で使える記法ならなんでも使えそう

まとめ

tex の数式以外はまぁ満足。