見出し画像

650円で作るArduino mozzi VCOモジュール-モジュラーシンセ自作

Arduino mozziライブラリを用いて、モジュラーシンセサイザー 2オシレータVCOモジュールを自作したので、その備忘録。

背景
コードの書けないシステムエンジニア脱却のために始めたプログラミングの18作品目。
本屋で「Arduinoではじめる手作り電子楽器」という本をみつけた。読んでみると、どうやらMozziというシンセサイザーに特化したライブラリがあるらしい。

画像2

Mozziライブラリには、ノコギリ波や三角波の様なプリミティブなオシレータの他にも、FMや、リバーブエフェクターにもなる様だ。しばらくはこのライブラリを使って、自作モジュールを作りたい。

制作物のスペック
ユーロラック規格 3U 6HPサイズ
電源:30mA ( at 5V ) / 29mA ( at12V )
5V単電源で動作可能。または12V単電源で動作可能。

出力波形:ノコギリ波、方形波、三角波、サイン波、ノイズ
2オシレータ
OSC1ツマミ:オシレータ1の周波数を変更
OSC2ツマミ:オシレータ2の周波数を変更
RATE IN:OSC1と2の音量割合を制御
V/oct(10bit , 5Vp-p)
トグルスイッチでオクターブを-1~+1切り替え。

画像1

製作費
総額650円
---------------------------------
Arduino nano 互換品200円
パネル 100円
オペアンプ 100円
etc

価格は平常時のもの。
2021年5月現在、世界的な半導体不足によりArduino nano互換品の値段が2倍に値上がりしている。STM32は、もはや入手すら難しい。
アメリカの寒波、台湾の水不足、コロナによる需要増加、日本の半導体工場の火災、ヨーロッパでのストライキ等、半導体産業の不幸が重なっている。

画像3

プログラミング
Mozziライブラリの使い方は、多くのwebページで紹介されているので、ここでは詳細を割愛。
ノウハウのみ記録する。

-V/oct
Arduino nanoは10bit ADCを搭載している。10bitという解像度は、ピッチを制御するには不足していると思い、対策を考えた。

まず、外付けの16bit ADCを検討したが、MozziとI2C通信の相性が悪く、あきらめた。
(探すとI2C通信が使える例もあるようだ。別の機会に挑戦したい。
"https://github.com/mgalardini/nuncha")

次に、Mozziに搭載されているオーバーサンプリングを試した。サンプリング回数を増やすことで、10bitのADCを、疑似的に12bitにするというもの。
しかし、応答速度が大幅に遅れ、ポルタメントが掛かった感じになるため、採用は見送った。

次に、クオンタイズを検討した。最も簡単な方法ではあるが、ビブラートやドローンの様な使い方が出来なくなる。
スイッチでクオンタイズのON/OFFを切り替える事も検討したが、6HPというサイズの制限があるので見送り。

最後は結局、10bitで妥協した。というのも、10bitの解像度でも悪くないと思ったからだ。
5[V] / 2^10[bit] = 4.88 m[V/LSB]
1V / 12[Semitone = 1Oct] = 83.3m[V/Semitone]
つまり、ピッチのずれは最大でも
4.88m[V/LSB]÷83m[V/Semitone]=0.058[Semitone/LSB] = 6cent

6セントは、ギターチューニングならば十分許されるピッチのずれだ。
もちろん、部品のバラツキで2~3LSBのずれが発生する可能性もあるが、ホビーユースならば許容できる。

50万円するBuchlaも、MOOG 3Cも、ピッチのずれは大きい。モジュラーシンセはそういう楽器なのだ。と自分に言い聞かせた。

-RATE IN
OSC1とOSC2のゲインを制御するCV IN。
色んな割合を網羅するため、若干複雑なグラフになっている。

画像5

-CONTROL RATE
MozziはCONTROL RATEという演算周期を設定できる。
64Hzだと知覚できるレベルで遅い。
256Hzだと動作が不安定になる。
よって、中間の128Hzを採用した。

画像4

(2021.6.13追記)分圧を避けるためA7端子にある330kohm抵抗は、V/octと100ohmの間に設置したほうがよい。

ハードウェア
D9とD10のパッシブフィルタを工夫した。
推奨は1poleだが、3.9kohmと10nFのローパスフィルタを追加している。
可聴域まで削れてしまうが、PWMの嫌なノイズが大幅に低減される。
どうせモジュラーシンセに手を出すのは中年ばかりだ。高音なんて、聞こえなくていい。

V/octの入力回路も、オペアンプを使ってインピーダンスを分離するのが理想だが、あまり効果が無いと感じたので割愛している。
代わりに、プルダウン抵抗を330kohmと大きめに設定している。分圧による影響を小さくするためだ。

ソフトもハードも多く妥協したが、コストと工数のバランスを意識した設計のつもりだ。

画像6

宣伝:オープンソースプロジェクトの支援をお願いします

DIYモジュラーシンセのオープンソースプロジェクトを継続するために、patreonというサービスでパトロンを募集しています。
コーヒー一杯の支援をいただけると嬉しいです。
また、パトロン限定のコンテンツも配信しています。

ソースコード
粗末だが公開する。悪い点があれば教えてもらえると勉強になる。
Mozziライブラリのインストールは必須だ。


#include <MozziGuts.h>
#include <Oscil.h> // oscillator template
//#include <OverSample.h>

#include <tables/saw2048_int8.h> // saw table for oscillator
#include <tables/square_no_alias512_int8.h> // saw table for oscillator
#include <tables/triangle_hermes_2048_int8.h> // saw table for oscillator
#include <tables/sin2048_int8.h> // sine table for oscillator
#include <tables/whitenoise8192_int8.h> // noise table for oscillator

Oscil <SAW2048_NUM_CELLS, AUDIO_RATE> aSaw1(SAW2048_DATA);
Oscil <SAW2048_NUM_CELLS, AUDIO_RATE> aSaw2(SAW2048_DATA);

Oscil <SQUARE_NO_ALIAS512_NUM_CELLS, AUDIO_RATE> aSqu1(SQUARE_NO_ALIAS512_DATA);
Oscil <SQUARE_NO_ALIAS512_NUM_CELLS, AUDIO_RATE> aSqu2(SQUARE_NO_ALIAS512_DATA);

Oscil <TRIANGLE_HERMES_2048_NUM_CELLS, AUDIO_RATE> aTri1(TRIANGLE_HERMES_2048_DATA);
Oscil <TRIANGLE_HERMES_2048_NUM_CELLS, AUDIO_RATE> aTri2(TRIANGLE_HERMES_2048_DATA);

Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin1(SIN2048_DATA);
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin2(SIN2048_DATA);

Oscil <WHITENOISE8192_NUM_CELLS, AUDIO_RATE> aNis1(WHITENOISE8192_DATA);
Oscil <WHITENOISE8192_NUM_CELLS, AUDIO_RATE> aNis2(WHITENOISE8192_DATA);
#define CONTROL_RATE 128 // Hz, powers of 2 are most reliable


int freq1 = 440;//base freq of OSC1
int freq2 = 220;//base freq of OSC2
int voct = 1000;//external V/OCT LSB
int freqv1 = 440;// freq1 apply voct
int freqv2 = 220;// freq2 apply voct
char octsw = 0;//1=-1oct,2=0oct,4=1oct
int wave_knob = 0;//AD wave knob
char wave = 0;//0_saw,1_squ,2_tri,3_sin,4_noise
byte gain = 127;

//const static float voctpow[4096] PROGMEM = {
//  0,  0.00122,  0.002441, 0.003662, 0.004882, 0.006103, 0.007324, 0.008544, 0.009765, 0.010986, 0.012207, 0.013427, 0.014648, 0.015869, 0.017089, 0.01831,  0.019531, 0.020751, 0.021972, 0.023193, 0.024414, 0.025634, 0.026855, 0.028076, 0.029296, 0.030517, 0.031738, 0.032958, 0.034179, 0.0354, 0.036621, 0.037841, 0.039062, 0.040283, 0.041503, 0.042724, 0.043945, 0.045166, 0.046386, 0.047607, 0.048828, 0.050048, 0.051269, 0.05249,  0.05371,  0.054931, 0.056152, 0.057373, 0.058593, 0.059814, 0.061035, 0.062255, 0.063476, 0.064697, 0.065917, 0.067138, 0.068359, 0.06958,  0.0708, 0.072021, 0.073242, 0.074462, 0.075683, 0.076904, 0.078125, 0.079345, 0.080566, 0.081787, 0.083007, 0.084228, 0.085449, 0.086669, 0.08789,  0.089111, 0.090332, 0.091552, 0.092773, 0.093994, 0.095214, 0.096435, 0.097656, 0.098876, 0.100097, 0.101318, 0.102539, 0.103759, 0.10498,  0.106201, 0.107421, 0.108642, 0.109863, 0.111083, 0.112304, 0.113525, 0.114746, 0.115966, 0.117187, 0.118408, 0.119628, 0.120849, 0.12207,  0.123291, 0.124511, 0.125732, 0.126953, 0.128173, 0.129394, 0.130615, 0.131835, 0.133056, 0.134277, 0.135498, 0.136718, 0.137939, 0.13916,  0.14038,  0.141601, 0.142822, 0.144042, 0.145263, 0.146484, 0.147705, 0.148925, 0.150146, 0.151367, 0.152587, 0.153808, 0.155029, 0.15625,  0.15747,  0.158691, 0.159912, 0.161132, 0.162353, 0.163574, 0.164794, 0.166015, 0.167236, 0.168457, 0.169677, 0.170898, 0.172119, 0.173339, 0.17456,  0.175781, 0.177001, 0.178222, 0.179443, 0.180664, 0.181884, 0.183105, 0.184326, 0.185546, 0.186767, 0.187988, 0.189208, 0.190429, 0.19165,  0.192871, 0.194091, 0.195312, 0.196533, 0.197753, 0.198974, 0.200195, 0.201416, 0.202636, 0.203857, 0.205078, 0.206298, 0.207519, 0.20874,  0.20996,  0.211181, 0.212402, 0.213623, 0.214843, 0.216064, 0.217285, 0.218505, 0.219726, 0.220947, 0.222167, 0.223388, 0.224609, 0.22583,  0.22705,  0.228271, 0.229492, 0.230712, 0.231933, 0.233154, 0.234375, 0.235595, 0.236816, 0.238037, 0.239257, 0.240478, 0.241699, 0.242919, 0.24414,  0.245361, 0.246582, 0.247802, 0.249023, 0.250244, 0.251464, 0.252685, 0.253906, 0.255126, 0.256347, 0.257568, 0.258789, 0.260009, 0.26123,  0.262451, 0.263671, 0.264892, 0.266113, 0.267333, 0.268554, 0.269775, 0.270996, 0.272216, 0.273437, 0.274658, 0.275878, 0.277099, 0.27832,  0.279541, 0.280761, 0.281982, 0.283203, 0.284423, 0.285644, 0.286865, 0.288085, 0.289306, 0.290527, 0.291748, 0.292968, 0.294189, 0.29541,  0.29663,  0.297851, 0.299072, 0.300292, 0.301513, 0.302734, 0.303955, 0.305175, 0.306396, 0.307617, 0.308837, 0.310058, 0.311279, 0.3125, 0.31372,  0.314941, 0.316162, 0.317382, 0.318603, 0.319824, 0.321044, 0.322265, 0.323486, 0.324707, 0.325927, 0.327148, 0.328369, 0.329589, 0.33081,  0.332031, 0.333251, 0.334472, 0.335693, 0.336914, 0.338134, 0.339355, 0.340576, 0.341796, 0.343017, 0.344238, 0.345458, 0.346679, 0.3479, 0.349121, 0.350341, 0.351562, 0.352783, 0.354003, 0.355224, 0.356445, 0.357666, 0.358886, 0.360107, 0.361328, 0.362548, 0.363769, 0.36499,  0.36621,  0.367431, 0.368652, 0.369873, 0.371093, 0.372314, 0.373535, 0.374755, 0.375976, 0.377197, 0.378417, 0.379638, 0.380859, 0.38208,  0.3833, 0.384521, 0.385742, 0.386962, 0.388183, 0.389404, 0.390625, 0.391845, 0.393066, 0.394287, 0.395507, 0.396728, 0.397949, 0.399169, 0.40039,  0.401611, 0.402832, 0.404052, 0.405273, 0.406494, 0.407714, 0.408935, 0.410156, 0.411376, 0.412597, 0.413818, 0.415039, 0.416259, 0.41748,  0.418701, 0.419921, 0.421142, 0.422363, 0.423583, 0.424804, 0.426025, 0.427246, 0.428466, 0.429687, 0.430908, 0.432128, 0.433349, 0.43457,  0.435791, 0.437011, 0.438232, 0.439453, 0.440673, 0.441894, 0.443115, 0.444335, 0.445556, 0.446777, 0.447998, 0.449218, 0.450439, 0.45166,  0.45288,  0.454101, 0.455322, 0.456542, 0.457763, 0.458984, 0.460205, 0.461425, 0.462646, 0.463867, 0.465087, 0.466308, 0.467529, 0.46875,  0.46997,  0.471191, 0.472412, 0.473632, 0.474853, 0.476074, 0.477294, 0.478515, 0.479736, 0.480957, 0.482177, 0.483398, 0.484619, 0.485839, 0.48706,  0.488281, 0.489501, 0.490722, 0.491943, 0.493164, 0.494384, 0.495605, 0.496826, 0.498046, 0.499267, 0.500488, 0.501708, 0.502929, 0.50415,  0.505371, 0.506591, 0.507812, 0.509033, 0.510253, 0.511474, 0.512695, 0.513916, 0.515136, 0.516357, 0.517578, 0.518798, 0.520019, 0.52124,  0.52246,  0.523681, 0.524902, 0.526123, 0.527343, 0.528564, 0.529785, 0.531005, 0.532226, 0.533447, 0.534667, 0.535888, 0.537109, 0.53833,  0.53955,  0.540771, 0.541992, 0.543212, 0.544433, 0.545654, 0.546875, 0.548095, 0.549316, 0.550537, 0.551757, 0.552978, 0.554199, 0.555419, 0.55664,  0.557861, 0.559082, 0.560302, 0.561523, 0.562744, 0.563964, 0.565185, 0.566406, 0.567626, 0.568847, 0.570068, 0.571289, 0.572509, 0.57373,  0.574951, 0.576171, 0.577392, 0.578613, 0.579833, 0.581054, 0.582275, 0.583496, 0.584716, 0.585937, 0.587158, 0.588378, 0.589599, 0.59082,  0.592041, 0.593261, 0.594482, 0.595703, 0.596923, 0.598144, 0.599365, 0.600585, 0.601806, 0.603027, 0.604248, 0.605468, 0.606689, 0.60791,  0.60913,  0.610351, 0.611572, 0.612792, 0.614013, 0.615234, 0.616455, 0.617675, 0.618896, 0.620117, 0.621337, 0.622558, 0.623779, 0.625,  0.62622,  0.627441, 0.628662, 0.629882, 0.631103, 0.632324, 0.633544, 0.634765, 0.635986, 0.637207, 0.638427, 0.639648, 0.640869, 0.642089, 0.64331,  0.644531, 0.645751, 0.646972, 0.648193, 0.649414, 0.650634, 0.651855, 0.653076, 0.654296, 0.655517, 0.656738, 0.657958, 0.659179, 0.6604, 0.661621, 0.662841, 0.664062, 0.665283, 0.666503, 0.667724, 0.668945, 0.670166, 0.671386, 0.672607, 0.673828, 0.675048, 0.676269, 0.67749,  0.67871,  0.679931, 0.681152, 0.682373, 0.683593, 0.684814, 0.686035, 0.687255, 0.688476, 0.689697, 0.690917, 0.692138, 0.693359, 0.69458,  0.6958, 0.697021, 0.698242, 0.699462, 0.700683, 0.701904, 0.703125, 0.704345, 0.705566, 0.706787, 0.708007, 0.709228, 0.710449, 0.711669, 0.71289,  0.714111, 0.715332, 0.716552, 0.717773, 0.718994, 0.720214, 0.721435, 0.722656, 0.723876, 0.725097, 0.726318, 0.727539, 0.728759, 0.72998,  0.731201, 0.732421, 0.733642, 0.734863, 0.736083, 0.737304, 0.738525, 0.739746, 0.740966, 0.742187, 0.743408, 0.744628, 0.745849, 0.74707,  0.748291, 0.749511, 0.750732, 0.751953, 0.753173, 0.754394, 0.755615, 0.756835, 0.758056, 0.759277, 0.760498, 0.761718, 0.762939, 0.76416,  0.76538,  0.766601, 0.767822, 0.769042, 0.770263, 0.771484, 0.772705, 0.773925, 0.775146, 0.776367, 0.777587, 0.778808, 0.780029, 0.78125,  0.78247,  0.783691, 0.784912, 0.786132, 0.787353, 0.788574, 0.789794, 0.791015, 0.792236, 0.793457, 0.794677, 0.795898, 0.797119, 0.798339, 0.79956,  0.800781, 0.802001, 0.803222, 0.804443, 0.805664, 0.806884, 0.808105, 0.809326, 0.810546, 0.811767, 0.812988, 0.814208, 0.815429, 0.81665,  0.817871, 0.819091, 0.820312, 0.821533, 0.822753, 0.823974, 0.825195, 0.826416, 0.827636, 0.828857, 0.830078, 0.831298, 0.832519, 0.83374,  0.83496,  0.836181, 0.837402, 0.838623, 0.839843, 0.841064, 0.842285, 0.843505, 0.844726, 0.845947, 0.847167, 0.848388, 0.849609, 0.85083,  0.85205,  0.853271, 0.854492, 0.855712, 0.856933, 0.858154, 0.859375, 0.860595, 0.861816, 0.863037, 0.864257, 0.865478, 0.866699, 0.867919, 0.86914,  0.870361, 0.871582, 0.872802, 0.874023, 0.875244, 0.876464, 0.877685, 0.878906, 0.880126, 0.881347, 0.882568, 0.883789, 0.885009, 0.88623,  0.887451, 0.888671, 0.889892, 0.891113, 0.892333, 0.893554, 0.894775, 0.895996, 0.897216, 0.898437, 0.899658, 0.900878, 0.902099, 0.90332,  0.904541, 0.905761, 0.906982, 0.908203, 0.909423, 0.910644, 0.911865, 0.913085, 0.914306, 0.915527, 0.916748, 0.917968, 0.919189, 0.92041,  0.92163,  0.922851, 0.924072, 0.925292, 0.926513, 0.927734, 0.928955, 0.930175, 0.931396, 0.932617, 0.933837, 0.935058, 0.936279, 0.9375, 0.93872,  0.939941, 0.941162, 0.942382, 0.943603, 0.944824, 0.946044, 0.947265, 0.948486, 0.949707, 0.950927, 0.952148, 0.953369, 0.954589, 0.95581,  0.957031, 0.958251, 0.959472, 0.960693, 0.961914, 0.963134, 0.964355, 0.965576, 0.966796, 0.968017, 0.969238, 0.970458, 0.971679, 0.9729, 0.974121, 0.975341, 0.976562, 0.977783, 0.979003, 0.980224, 0.981445, 0.982666, 0.983886, 0.985107, 0.986328, 0.987548, 0.988769, 0.98999,  0.99121,  0.992431, 0.993652, 0.994873, 0.996093, 0.997314, 0.998535, 0.999755, 1.000976, 1.002197, 1.003417, 1.004638, 1.005859, 1.00708,  1.0083, 1.009521, 1.010742, 1.011962, 1.013183, 1.014404, 1.015625, 1.016845, 1.018066, 1.019287, 1.020507, 1.021728, 1.022949, 1.024169, 1.02539,  1.026611, 1.027832, 1.029052, 1.030273, 1.031494, 1.032714, 1.033935, 1.035156, 1.036376, 1.037597, 1.038818, 1.040039, 1.041259, 1.04248,  1.043701, 1.044921, 1.046142, 1.047363, 1.048583, 1.049804, 1.051025, 1.052246, 1.053466, 1.054687, 1.055908, 1.057128, 1.058349, 1.05957,  1.060791, 1.062011, 1.063232, 1.064453, 1.065673, 1.066894, 1.068115, 1.069335, 1.070556, 1.071777, 1.072998, 1.074218, 1.075439, 1.07666,  1.07788,  1.079101, 1.080322, 1.081542, 1.082763, 1.083984, 1.085205, 1.086425, 1.087646, 1.088867, 1.090087, 1.091308, 1.092529, 1.09375,  1.09497,  1.096191, 1.097412, 1.098632, 1.099853, 1.101074, 1.102294, 1.103515, 1.104736, 1.105957, 1.107177, 1.108398, 1.109619, 1.110839, 1.11206,  1.113281, 1.114501, 1.115722, 1.116943, 1.118164, 1.119384, 1.120605, 1.121826, 1.123046, 1.124267, 1.125488, 1.126708, 1.127929, 1.12915,  1.130371, 1.131591, 1.132812, 1.134033, 1.135253, 1.136474, 1.137695, 1.138916, 1.140136, 1.141357, 1.142578, 1.143798, 1.145019, 1.14624,  1.14746,  1.148681, 1.149902, 1.151123, 1.152343, 1.153564, 1.154785, 1.156005, 1.157226, 1.158447, 1.159667, 1.160888, 1.162109, 1.16333,  1.16455,  1.165771, 1.166992, 1.168212, 1.169433, 1.170654, 1.171875, 1.173095, 1.174316, 1.175537, 1.176757, 1.177978, 1.179199, 1.180419, 1.18164,  1.182861, 1.184082, 1.185302, 1.186523, 1.187744, 1.188964, 1.190185, 1.191406, 1.192626, 1.193847, 1.195068, 1.196289, 1.197509, 1.19873,  1.199951, 1.201171, 1.202392, 1.203613, 1.204833, 1.206054, 1.207275, 1.208496, 1.209716, 1.210937, 1.212158, 1.213378, 1.214599, 1.21582,  1.217041, 1.218261, 1.219482, 1.220703, 1.221923, 1.223144, 1.224365, 1.225585, 1.226806, 1.228027, 1.229248, 1.230468, 1.231689, 1.23291,  1.23413,  1.235351, 1.236572, 1.237792, 1.239013, 1.240234, 1.241455, 1.242675, 1.243896, 1.245117, 1.246337, 1.247558, 1.248779, 1.25, 1.25122,  1.252441, 1.253662, 1.254882, 1.256103, 1.257324, 1.258544, 1.259765, 1.260986, 1.262207, 1.263427, 1.264648, 1.265869, 1.267089, 1.26831,  1.269531, 1.270751, 1.271972, 1.273193, 1.274414, 1.275634, 1.276855, 1.278076, 1.279296, 1.280517, 1.281738, 1.282958, 1.284179, 1.2854, 1.286621, 1.287841, 1.289062, 1.290283, 1.291503, 1.292724, 1.293945, 1.295166, 1.296386, 1.297607, 1.298828, 1.300048, 1.301269, 1.30249,  1.30371,  1.304931, 1.306152, 1.307373, 1.308593, 1.309814, 1.311035, 1.312255, 1.313476, 1.314697, 1.315917, 1.317138, 1.318359, 1.31958,  1.3208, 1.322021, 1.323242, 1.324462, 1.325683, 1.326904, 1.328125, 1.329345, 1.330566, 1.331787, 1.333007, 1.334228, 1.335449, 1.336669, 1.33789,  1.339111, 1.340332, 1.341552, 1.342773, 1.343994, 1.345214, 1.346435, 1.347656, 1.348876, 1.350097, 1.351318, 1.352539, 1.353759, 1.35498,  1.356201, 1.357421, 1.358642, 1.359863, 1.361083, 1.362304, 1.363525, 1.364746, 1.365966, 1.367187, 1.368408, 1.369628, 1.370849, 1.37207,  1.373291, 1.374511, 1.375732, 1.376953, 1.378173, 1.379394, 1.380615, 1.381835, 1.383056, 1.384277, 1.385498, 1.386718, 1.387939, 1.38916,  1.39038,  1.391601, 1.392822, 1.394042, 1.395263, 1.396484, 1.397705, 1.398925, 1.400146, 1.401367, 1.402587, 1.403808, 1.405029, 1.40625,  1.40747,  1.408691, 1.409912, 1.411132, 1.412353, 1.413574, 1.414794, 1.416015, 1.417236, 1.418457, 1.419677, 1.420898, 1.422119, 1.423339, 1.42456,  1.425781, 1.427001, 1.428222, 1.429443, 1.430664, 1.431884, 1.433105, 1.434326, 1.435546, 1.436767, 1.437988, 1.439208, 1.440429, 1.44165,  1.442871, 1.444091, 1.445312, 1.446533, 1.447753, 1.448974, 1.450195, 1.451416, 1.452636, 1.453857, 1.455078, 1.456298, 1.457519, 1.45874,  1.45996,  1.461181, 1.462402, 1.463623, 1.464843, 1.466064, 1.467285, 1.468505, 1.469726, 1.470947, 1.472167, 1.473388, 1.474609, 1.47583,  1.47705,  1.478271, 1.479492, 1.480712, 1.481933, 1.483154, 1.484375, 1.485595, 1.486816, 1.488037, 1.489257, 1.490478, 1.491699, 1.492919, 1.49414,  1.495361, 1.496582, 1.497802, 1.499023, 1.500244, 1.501464, 1.502685, 1.503906, 1.505126, 1.506347, 1.507568, 1.508789, 1.510009, 1.51123,  1.512451, 1.513671, 1.514892, 1.516113, 1.517333, 1.518554, 1.519775, 1.520996, 1.522216, 1.523437, 1.524658, 1.525878, 1.527099, 1.52832,  1.529541, 1.530761, 1.531982, 1.533203, 1.534423, 1.535644, 1.536865, 1.538085, 1.539306, 1.540527, 1.541748, 1.542968, 1.544189, 1.54541,  1.54663,  1.547851, 1.549072, 1.550292, 1.551513, 1.552734, 1.553955, 1.555175, 1.556396, 1.557617, 1.558837, 1.560058, 1.561279, 1.5625, 1.56372,  1.564941, 1.566162, 1.567382, 1.568603, 1.569824, 1.571044, 1.572265, 1.573486, 1.574707, 1.575927, 1.577148, 1.578369, 1.579589, 1.58081,  1.582031, 1.583251, 1.584472, 1.585693, 1.586914, 1.588134, 1.589355, 1.590576, 1.591796, 1.593017, 1.594238, 1.595458, 1.596679, 1.5979, 1.599121, 1.600341, 1.601562, 1.602783, 1.604003, 1.605224, 1.606445, 1.607666, 1.608886, 1.610107, 1.611328, 1.612548, 1.613769, 1.61499,  1.61621,  1.617431, 1.618652, 1.619873, 1.621093, 1.622314, 1.623535, 1.624755, 1.625976, 1.627197, 1.628417, 1.629638, 1.630859, 1.63208,  1.6333, 1.634521, 1.635742, 1.636962, 1.638183, 1.639404, 1.640625, 1.641845, 1.643066, 1.644287, 1.645507, 1.646728, 1.647949, 1.649169, 1.65039,  1.651611, 1.652832, 1.654052, 1.655273, 1.656494, 1.657714, 1.658935, 1.660156, 1.661376, 1.662597, 1.663818, 1.665039, 1.666259, 1.66748,  1.668701, 1.669921, 1.671142, 1.672363, 1.673583, 1.674804, 1.676025, 1.677246, 1.678466, 1.679687, 1.680908, 1.682128, 1.683349, 1.68457,  1.685791, 1.687011, 1.688232, 1.689453, 1.690673, 1.691894, 1.693115, 1.694335, 1.695556, 1.696777, 1.697998, 1.699218, 1.700439, 1.70166,  1.70288,  1.704101, 1.705322, 1.706542, 1.707763, 1.708984, 1.710205, 1.711425, 1.712646, 1.713867, 1.715087, 1.716308, 1.717529, 1.71875,  1.71997,  1.721191, 1.722412, 1.723632, 1.724853, 1.726074, 1.727294, 1.728515, 1.729736, 1.730957, 1.732177, 1.733398, 1.734619, 1.735839, 1.73706,  1.738281, 1.739501, 1.740722, 1.741943, 1.743164, 1.744384, 1.745605, 1.746826, 1.748046, 1.749267, 1.750488, 1.751708, 1.752929, 1.75415,  1.755371, 1.756591, 1.757812, 1.759033, 1.760253, 1.761474, 1.762695, 1.763916, 1.765136, 1.766357, 1.767578, 1.768798, 1.770019, 1.77124,  1.77246,  1.773681, 1.774902, 1.776123, 1.777343, 1.778564, 1.779785, 1.781005, 1.782226, 1.783447, 1.784667, 1.785888, 1.787109, 1.78833,  1.78955,  1.790771, 1.791992, 1.793212, 1.794433, 1.795654, 1.796875, 1.798095, 1.799316, 1.800537, 1.801757, 1.802978, 1.804199, 1.805419, 1.80664,  1.807861, 1.809082, 1.810302, 1.811523, 1.812744, 1.813964, 1.815185, 1.816406, 1.817626, 1.818847, 1.820068, 1.821289, 1.822509, 1.82373,  1.824951, 1.826171, 1.827392, 1.828613, 1.829833, 1.831054, 1.832275, 1.833496, 1.834716, 1.835937, 1.837158, 1.838378, 1.839599, 1.84082,  1.842041, 1.843261, 1.844482, 1.845703, 1.846923, 1.848144, 1.849365, 1.850585, 1.851806, 1.853027, 1.854248, 1.855468, 1.856689, 1.85791,  1.85913,  1.860351, 1.861572, 1.862792, 1.864013, 1.865234, 1.866455, 1.867675, 1.868896, 1.870117, 1.871337, 1.872558, 1.873779, 1.875,  1.87622,  1.877441, 1.878662, 1.879882, 1.881103, 1.882324, 1.883544, 1.884765, 1.885986, 1.887207, 1.888427, 1.889648, 1.890869, 1.892089, 1.89331,  1.894531, 1.895751, 1.896972, 1.898193, 1.899414, 1.900634, 1.901855, 1.903076, 1.904296, 1.905517, 1.906738, 1.907958, 1.909179, 1.9104, 1.911621, 1.912841, 1.914062, 1.915283, 1.916503, 1.917724, 1.918945, 1.920166, 1.921386, 1.922607, 1.923828, 1.925048, 1.926269, 1.92749,  1.92871,  1.929931, 1.931152, 1.932373, 1.933593, 1.934814, 1.936035, 1.937255, 1.938476, 1.939697, 1.940917, 1.942138, 1.943359, 1.94458,  1.9458, 1.947021, 1.948242, 1.949462, 1.950683, 1.951904, 1.953125, 1.954345, 1.955566, 1.956787, 1.958007, 1.959228, 1.960449, 1.961669, 1.96289,  1.964111, 1.965332, 1.966552, 1.967773, 1.968994, 1.970214, 1.971435, 1.972656, 1.973876, 1.975097, 1.976318, 1.977539, 1.978759, 1.97998,  1.981201, 1.982421, 1.983642, 1.984863, 1.986083, 1.987304, 1.988525, 1.989746, 1.990966, 1.992187, 1.993408, 1.994628, 1.995849, 1.99707,  1.998291, 1.999511, 2.000732, 2.001953, 2.003173, 2.004394, 2.005615, 2.006835, 2.008056, 2.009277, 2.010498, 2.011718, 2.012939, 2.01416,  2.01538,  2.016601, 2.017822, 2.019042, 2.020263, 2.021484, 2.022705, 2.023925, 2.025146, 2.026367, 2.027587, 2.028808, 2.030029, 2.03125,  2.03247,  2.033691, 2.034912, 2.036132, 2.037353, 2.038574, 2.039794, 2.041015, 2.042236, 2.043457, 2.044677, 2.045898, 2.047119, 2.048339, 2.04956,  2.050781, 2.052001, 2.053222, 2.054443, 2.055664, 2.056884, 2.058105, 2.059326, 2.060546, 2.061767, 2.062988, 2.064208, 2.065429, 2.06665,  2.067871, 2.069091, 2.070312, 2.071533, 2.072753, 2.073974, 2.075195, 2.076416, 2.077636, 2.078857, 2.080078, 2.081298, 2.082519, 2.08374,  2.08496,  2.086181, 2.087402, 2.088623, 2.089843, 2.091064, 2.092285, 2.093505, 2.094726, 2.095947, 2.097167, 2.098388, 2.099609, 2.10083,  2.10205,  2.103271, 2.104492, 2.105712, 2.106933, 2.108154, 2.109375, 2.110595, 2.111816, 2.113037, 2.114257, 2.115478, 2.116699, 2.117919, 2.11914,  2.120361, 2.121582, 2.122802, 2.124023, 2.125244, 2.126464, 2.127685, 2.128906, 2.130126, 2.131347, 2.132568, 2.133789, 2.135009, 2.13623,  2.137451, 2.138671, 2.139892, 2.141113, 2.142333, 2.143554, 2.144775, 2.145996, 2.147216, 2.148437, 2.149658, 2.150878, 2.152099, 2.15332,  2.154541, 2.155761, 2.156982, 2.158203, 2.159423, 2.160644, 2.161865, 2.163085, 2.164306, 2.165527, 2.166748, 2.167968, 2.169189, 2.17041,  2.17163,  2.172851, 2.174072, 2.175292, 2.176513, 2.177734, 2.178955, 2.180175, 2.181396, 2.182617, 2.183837, 2.185058, 2.186279, 2.1875, 2.18872,  2.189941, 2.191162, 2.192382, 2.193603, 2.194824, 2.196044, 2.197265, 2.198486, 2.199707, 2.200927, 2.202148, 2.203369, 2.204589, 2.20581,  2.207031, 2.208251, 2.209472, 2.210693, 2.211914, 2.213134, 2.214355, 2.215576, 2.216796, 2.218017, 2.219238, 2.220458, 2.221679, 2.2229, 2.224121, 2.225341, 2.226562, 2.227783, 2.229003, 2.230224, 2.231445, 2.232666, 2.233886, 2.235107, 2.236328, 2.237548, 2.238769, 2.23999,  2.24121,  2.242431, 2.243652, 2.244873, 2.246093, 2.247314, 2.248535, 2.249755, 2.250976, 2.252197, 2.253417, 2.254638, 2.255859, 2.25708,  2.2583, 2.259521, 2.260742, 2.261962, 2.263183, 2.264404, 2.265625, 2.266845, 2.268066, 2.269287, 2.270507, 2.271728, 2.272949, 2.274169, 2.27539,  2.276611, 2.277832, 2.279052, 2.280273, 2.281494, 2.282714, 2.283935, 2.285156, 2.286376, 2.287597, 2.288818, 2.290039, 2.291259, 2.29248,  2.293701, 2.294921, 2.296142, 2.297363, 2.298583, 2.299804, 2.301025, 2.302246, 2.303466, 2.304687, 2.305908, 2.307128, 2.308349, 2.30957,  2.310791, 2.312011, 2.313232, 2.314453, 2.315673, 2.316894, 2.318115, 2.319335, 2.320556, 2.321777, 2.322998, 2.324218, 2.325439, 2.32666,  2.32788,  2.329101, 2.330322, 2.331542, 2.332763, 2.333984, 2.335205, 2.336425, 2.337646, 2.338867, 2.340087, 2.341308, 2.342529, 2.34375,  2.34497,  2.346191, 2.347412, 2.348632, 2.349853, 2.351074, 2.352294, 2.353515, 2.354736, 2.355957, 2.357177, 2.358398, 2.359619, 2.360839, 2.36206,  2.363281, 2.364501, 2.365722, 2.366943, 2.368164, 2.369384, 2.370605, 2.371826, 2.373046, 2.374267, 2.375488, 2.376708, 2.377929, 2.37915,  2.380371, 2.381591, 2.382812, 2.384033, 2.385253, 2.386474, 2.387695, 2.388916, 2.390136, 2.391357, 2.392578, 2.393798, 2.395019, 2.39624,  2.39746,  2.398681, 2.399902, 2.401123, 2.402343, 2.403564, 2.404785, 2.406005, 2.407226, 2.408447, 2.409667, 2.410888, 2.412109, 2.41333,  2.41455,  2.415771, 2.416992, 2.418212, 2.419433, 2.420654, 2.421875, 2.423095, 2.424316, 2.425537, 2.426757, 2.427978, 2.429199, 2.430419, 2.43164,  2.432861, 2.434082, 2.435302, 2.436523, 2.437744, 2.438964, 2.440185, 2.441406, 2.442626, 2.443847, 2.445068, 2.446289, 2.447509, 2.44873,  2.449951, 2.451171, 2.452392, 2.453613, 2.454833, 2.456054, 2.457275, 2.458496, 2.459716, 2.460937, 2.462158, 2.463378, 2.464599, 2.46582,  2.467041, 2.468261, 2.469482, 2.470703, 2.471923, 2.473144, 2.474365, 2.475585, 2.476806, 2.478027, 2.479248, 2.480468, 2.481689, 2.48291,  2.48413,  2.485351, 2.486572, 2.487792, 2.489013, 2.490234, 2.491455, 2.492675, 2.493896, 2.495117, 2.496337, 2.497558, 2.498779, 2.5,  2.50122,  2.502441, 2.503662, 2.504882, 2.506103, 2.507324, 2.508544, 2.509765, 2.510986, 2.512207, 2.513427, 2.514648, 2.515869, 2.517089, 2.51831,  2.519531, 2.520751, 2.521972, 2.523193, 2.524414, 2.525634, 2.526855, 2.528076, 2.529296, 2.530517, 2.531738, 2.532958, 2.534179, 2.5354, 2.536621, 2.537841, 2.539062, 2.540283, 2.541503, 2.542724, 2.543945, 2.545166, 2.546386, 2.547607, 2.548828, 2.550048, 2.551269, 2.55249,  2.55371,  2.554931, 2.556152, 2.557373, 2.558593, 2.559814, 2.561035, 2.562255, 2.563476, 2.564697, 2.565917, 2.567138, 2.568359, 2.56958,  2.5708, 2.572021, 2.573242, 2.574462, 2.575683, 2.576904, 2.578125, 2.579345, 2.580566, 2.581787, 2.583007, 2.584228, 2.585449, 2.586669, 2.58789,  2.589111, 2.590332, 2.591552, 2.592773, 2.593994, 2.595214, 2.596435, 2.597656, 2.598876, 2.600097, 2.601318, 2.602539, 2.603759, 2.60498,  2.606201, 2.607421, 2.608642, 2.609863, 2.611083, 2.612304, 2.613525, 2.614746, 2.615966, 2.617187, 2.618408, 2.619628, 2.620849, 2.62207,  2.623291, 2.624511, 2.625732, 2.626953, 2.628173, 2.629394, 2.630615, 2.631835, 2.633056, 2.634277, 2.635498, 2.636718, 2.637939, 2.63916,  2.64038,  2.641601, 2.642822, 2.644042, 2.645263, 2.646484, 2.647705, 2.648925, 2.650146, 2.651367, 2.652587, 2.653808, 2.655029, 2.65625,  2.65747,  2.658691, 2.659912, 2.661132, 2.662353, 2.663574, 2.664794, 2.666015, 2.667236, 2.668457, 2.669677, 2.670898, 2.672119, 2.673339, 2.67456,  2.675781, 2.677001, 2.678222, 2.679443, 2.680664, 2.681884, 2.683105, 2.684326, 2.685546, 2.686767, 2.687988, 2.689208, 2.690429, 2.69165,  2.692871, 2.694091, 2.695312, 2.696533, 2.697753, 2.698974, 2.700195, 2.701416, 2.702636, 2.703857, 2.705078, 2.706298, 2.707519, 2.70874,  2.70996,  2.711181, 2.712402, 2.713623, 2.714843, 2.716064, 2.717285, 2.718505, 2.719726, 2.720947, 2.722167, 2.723388, 2.724609, 2.72583,  2.72705,  2.728271, 2.729492, 2.730712, 2.731933, 2.733154, 2.734375, 2.735595, 2.736816, 2.738037, 2.739257, 2.740478, 2.741699, 2.742919, 2.74414,  2.745361, 2.746582, 2.747802, 2.749023, 2.750244, 2.751464, 2.752685, 2.753906, 2.755126, 2.756347, 2.757568, 2.758789, 2.760009, 2.76123,  2.762451, 2.763671, 2.764892, 2.766113, 2.767333, 2.768554, 2.769775, 2.770996, 2.772216, 2.773437, 2.774658, 2.775878, 2.777099, 2.77832,  2.779541, 2.780761, 2.781982, 2.783203, 2.784423, 2.785644, 2.786865, 2.788085, 2.789306, 2.790527, 2.791748, 2.792968, 2.794189, 2.79541,  2.79663,  2.797851, 2.799072, 2.800292, 2.801513, 2.802734, 2.803955, 2.805175, 2.806396, 2.807617, 2.808837, 2.810058, 2.811279, 2.8125, 2.81372,  2.814941, 2.816162, 2.817382, 2.818603, 2.819824, 2.821044, 2.822265, 2.823486, 2.824707, 2.825927, 2.827148, 2.828369, 2.829589, 2.83081,  2.832031, 2.833251, 2.834472, 2.835693, 2.836914, 2.838134, 2.839355, 2.840576, 2.841796, 2.843017, 2.844238, 2.845458, 2.846679, 2.8479, 2.849121, 2.850341, 2.851562, 2.852783, 2.854003, 2.855224, 2.856445, 2.857666, 2.858886, 2.860107, 2.861328, 2.862548, 2.863769, 2.86499,  2.86621,  2.867431, 2.868652, 2.869873, 2.871093, 2.872314, 2.873535, 2.874755, 2.875976, 2.877197, 2.878417, 2.879638, 2.880859, 2.88208,  2.8833, 2.884521, 2.885742, 2.886962, 2.888183, 2.889404, 2.890625, 2.891845, 2.893066, 2.894287, 2.895507, 2.896728, 2.897949, 2.899169, 2.90039,  2.901611, 2.902832, 2.904052, 2.905273, 2.906494, 2.907714, 2.908935, 2.910156, 2.911376, 2.912597, 2.913818, 2.915039, 2.916259, 2.91748,  2.918701, 2.919921, 2.921142, 2.922363, 2.923583, 2.924804, 2.926025, 2.927246, 2.928466, 2.929687, 2.930908, 2.932128, 2.933349, 2.93457,  2.935791, 2.937011, 2.938232, 2.939453, 2.940673, 2.941894, 2.943115, 2.944335, 2.945556, 2.946777, 2.947998, 2.949218, 2.950439, 2.95166,  2.95288,  2.954101, 2.955322, 2.956542, 2.957763, 2.958984, 2.960205, 2.961425, 2.962646, 2.963867, 2.965087, 2.966308, 2.967529, 2.96875,  2.96997,  2.971191, 2.972412, 2.973632, 2.974853, 2.976074, 2.977294, 2.978515, 2.979736, 2.980957, 2.982177, 2.983398, 2.984619, 2.985839, 2.98706,  2.988281, 2.989501, 2.990722, 2.991943, 2.993164, 2.994384, 2.995605, 2.996826, 2.998046, 2.999267, 3.000488, 3.001708, 3.002929, 3.00415,  3.005371, 3.006591, 3.007812, 3.009033, 3.010253, 3.011474, 3.012695, 3.013916, 3.015136, 3.016357, 3.017578, 3.018798, 3.020019, 3.02124,  3.02246,  3.023681, 3.024902, 3.026123, 3.027343, 3.028564, 3.029785, 3.031005, 3.032226, 3.033447, 3.034667, 3.035888, 3.037109, 3.03833,  3.03955,  3.040771, 3.041992, 3.043212, 3.044433, 3.045654, 3.046875, 3.048095, 3.049316, 3.050537, 3.051757, 3.052978, 3.054199, 3.055419, 3.05664,  3.057861, 3.059082, 3.060302, 3.061523, 3.062744, 3.063964, 3.065185, 3.066406, 3.067626, 3.068847, 3.070068, 3.071289, 3.072509, 3.07373,  3.074951, 3.076171, 3.077392, 3.078613, 3.079833, 3.081054, 3.082275, 3.083496, 3.084716, 3.085937, 3.087158, 3.088378, 3.089599, 3.09082,  3.092041, 3.093261, 3.094482, 3.095703, 3.096923, 3.098144, 3.099365, 3.100585, 3.101806, 3.103027, 3.104248, 3.105468, 3.106689, 3.10791,  3.10913,  3.110351, 3.111572, 3.112792, 3.114013, 3.115234, 3.116455, 3.117675, 3.118896, 3.120117, 3.121337, 3.122558, 3.123779, 3.125,  3.12622,  3.127441, 3.128662, 3.129882, 3.131103, 3.132324, 3.133544, 3.134765, 3.135986, 3.137207, 3.138427, 3.139648, 3.140869, 3.142089, 3.14331,  3.144531, 3.145751, 3.146972, 3.148193, 3.149414, 3.150634, 3.151855, 3.153076, 3.154296, 3.155517, 3.156738, 3.157958, 3.159179, 3.1604, 3.161621, 3.162841, 3.164062, 3.165283, 3.166503, 3.167724, 3.168945, 3.170166, 3.171386, 3.172607, 3.173828, 3.175048, 3.176269, 3.17749,  3.17871,  3.179931, 3.181152, 3.182373, 3.183593, 3.184814, 3.186035, 3.187255, 3.188476, 3.189697, 3.190917, 3.192138, 3.193359, 3.19458,  3.1958, 3.197021, 3.198242, 3.199462, 3.200683, 3.201904, 3.203125, 3.204345, 3.205566, 3.206787, 3.208007, 3.209228, 3.210449, 3.211669, 3.21289,  3.214111, 3.215332, 3.216552, 3.217773, 3.218994, 3.220214, 3.221435, 3.222656, 3.223876, 3.225097, 3.226318, 3.227539, 3.228759, 3.22998,  3.231201, 3.232421, 3.233642, 3.234863, 3.236083, 3.237304, 3.238525, 3.239746, 3.240966, 3.242187, 3.243408, 3.244628, 3.245849, 3.24707,  3.248291, 3.249511, 3.250732, 3.251953, 3.253173, 3.254394, 3.255615, 3.256835, 3.258056, 3.259277, 3.260498, 3.261718, 3.262939, 3.26416,  3.26538,  3.266601, 3.267822, 3.269042, 3.270263, 3.271484, 3.272705, 3.273925, 3.275146, 3.276367, 3.277587, 3.278808, 3.280029, 3.28125,  3.28247,  3.283691, 3.284912, 3.286132, 3.287353, 3.288574, 3.289794, 3.291015, 3.292236, 3.293457, 3.294677, 3.295898, 3.297119, 3.298339, 3.29956,  3.300781, 3.302001, 3.303222, 3.304443, 3.305664, 3.306884, 3.308105, 3.309326, 3.310546, 3.311767, 3.312988, 3.314208, 3.315429, 3.31665,  3.317871, 3.319091, 3.320312, 3.321533, 3.322753, 3.323974, 3.325195, 3.326416, 3.327636, 3.328857, 3.330078, 3.331298, 3.332519, 3.33374,  3.33496,  3.336181, 3.337402, 3.338623, 3.339843, 3.341064, 3.342285, 3.343505, 3.344726, 3.345947, 3.347167, 3.348388, 3.349609, 3.35083,  3.35205,  3.353271, 3.354492, 3.355712, 3.356933, 3.358154, 3.359375, 3.360595, 3.361816, 3.363037, 3.364257, 3.365478, 3.366699, 3.367919, 3.36914,  3.370361, 3.371582, 3.372802, 3.374023, 3.375244, 3.376464, 3.377685, 3.378906, 3.380126, 3.381347, 3.382568, 3.383789, 3.385009, 3.38623,  3.387451, 3.388671, 3.389892, 3.391113, 3.392333, 3.393554, 3.394775, 3.395996, 3.397216, 3.398437, 3.399658, 3.400878, 3.402099, 3.40332,  3.404541, 3.405761, 3.406982, 3.408203, 3.409423, 3.410644, 3.411865, 3.413085, 3.414306, 3.415527, 3.416748, 3.417968, 3.419189, 3.42041,  3.42163,  3.422851, 3.424072, 3.425292, 3.426513, 3.427734, 3.428955, 3.430175, 3.431396, 3.432617, 3.433837, 3.435058, 3.436279, 3.4375, 3.43872,  3.439941, 3.441162, 3.442382, 3.443603, 3.444824, 3.446044, 3.447265, 3.448486, 3.449707, 3.450927, 3.452148, 3.453369, 3.454589, 3.45581,  3.457031, 3.458251, 3.459472, 3.460693, 3.461914, 3.463134, 3.464355, 3.465576, 3.466796, 3.468017, 3.469238, 3.470458, 3.471679, 3.4729, 3.474121, 3.475341, 3.476562, 3.477783, 3.479003, 3.480224, 3.481445, 3.482666, 3.483886, 3.485107, 3.486328, 3.487548, 3.488769, 3.48999,  3.49121,  3.492431, 3.493652, 3.494873, 3.496093, 3.497314, 3.498535, 3.499755, 3.500976, 3.502197, 3.503417, 3.504638, 3.505859, 3.50708,  3.5083, 3.509521, 3.510742, 3.511962, 3.513183, 3.514404, 3.515625, 3.516845, 3.518066, 3.519287, 3.520507, 3.521728, 3.522949, 3.524169, 3.52539,  3.526611, 3.527832, 3.529052, 3.530273, 3.531494, 3.532714, 3.533935, 3.535156, 3.536376, 3.537597, 3.538818, 3.540039, 3.541259, 3.54248,  3.543701, 3.544921, 3.546142, 3.547363, 3.548583, 3.549804, 3.551025, 3.552246, 3.553466, 3.554687, 3.555908, 3.557128, 3.558349, 3.55957,  3.560791, 3.562011, 3.563232, 3.564453, 3.565673, 3.566894, 3.568115, 3.569335, 3.570556, 3.571777, 3.572998, 3.574218, 3.575439, 3.57666,  3.57788,  3.579101, 3.580322, 3.581542, 3.582763, 3.583984, 3.585205, 3.586425, 3.587646, 3.588867, 3.590087, 3.591308, 3.592529, 3.59375,  3.59497,  3.596191, 3.597412, 3.598632, 3.599853, 3.601074, 3.602294, 3.603515, 3.604736, 3.605957, 3.607177, 3.608398, 3.609619, 3.610839, 3.61206,  3.613281, 3.614501, 3.615722, 3.616943, 3.618164, 3.619384, 3.620605, 3.621826, 3.623046, 3.624267, 3.625488, 3.626708, 3.627929, 3.62915,  3.630371, 3.631591, 3.632812, 3.634033, 3.635253, 3.636474, 3.637695, 3.638916, 3.640136, 3.641357, 3.642578, 3.643798, 3.645019, 3.64624,  3.64746,  3.648681, 3.649902, 3.651123, 3.652343, 3.653564, 3.654785, 3.656005, 3.657226, 3.658447, 3.659667, 3.660888, 3.662109, 3.66333,  3.66455,  3.665771, 3.666992, 3.668212, 3.669433, 3.670654, 3.671875, 3.673095, 3.674316, 3.675537, 3.676757, 3.677978, 3.679199, 3.680419, 3.68164,  3.682861, 3.684082, 3.685302, 3.686523, 3.687744, 3.688964, 3.690185, 3.691406, 3.692626, 3.693847, 3.695068, 3.696289, 3.697509, 3.69873,  3.699951, 3.701171, 3.702392, 3.703613, 3.704833, 3.706054, 3.707275, 3.708496, 3.709716, 3.710937, 3.712158, 3.713378, 3.714599, 3.71582,  3.717041, 3.718261, 3.719482, 3.720703, 3.721923, 3.723144, 3.724365, 3.725585, 3.726806, 3.728027, 3.729248, 3.730468, 3.731689, 3.73291,  3.73413,  3.735351, 3.736572, 3.737792, 3.739013, 3.740234, 3.741455, 3.742675, 3.743896, 3.745117, 3.746337, 3.747558, 3.748779, 3.75, 3.75122,  3.752441, 3.753662, 3.754882, 3.756103, 3.757324, 3.758544, 3.759765, 3.760986, 3.762207, 3.763427, 3.764648, 3.765869, 3.767089, 3.76831,  3.769531, 3.770751, 3.771972, 3.773193, 3.774414, 3.775634, 3.776855, 3.778076, 3.779296, 3.780517, 3.781738, 3.782958, 3.784179, 3.7854, 3.786621, 3.787841, 3.789062, 3.790283, 3.791503, 3.792724, 3.793945, 3.795166, 3.796386, 3.797607, 3.798828, 3.800048, 3.801269, 3.80249,  3.80371,  3.804931, 3.806152, 3.807373, 3.808593, 3.809814, 3.811035, 3.812255, 3.813476, 3.814697, 3.815917, 3.817138, 3.818359, 3.81958,  3.8208, 3.822021, 3.823242, 3.824462, 3.825683, 3.826904, 3.828125, 3.829345, 3.830566, 3.831787, 3.833007, 3.834228, 3.835449, 3.836669, 3.83789,  3.839111, 3.840332, 3.841552, 3.842773, 3.843994, 3.845214, 3.846435, 3.847656, 3.848876, 3.850097, 3.851318, 3.852539, 3.853759, 3.85498,  3.856201, 3.857421, 3.858642, 3.859863, 3.861083, 3.862304, 3.863525, 3.864746, 3.865966, 3.867187, 3.868408, 3.869628, 3.870849, 3.87207,  3.873291, 3.874511, 3.875732, 3.876953, 3.878173, 3.879394, 3.880615, 3.881835, 3.883056, 3.884277, 3.885498, 3.886718, 3.887939, 3.88916,  3.89038,  3.891601, 3.892822, 3.894042, 3.895263, 3.896484, 3.897705, 3.898925, 3.900146, 3.901367, 3.902587, 3.903808, 3.905029, 3.90625,  3.90747,  3.908691, 3.909912, 3.911132, 3.912353, 3.913574, 3.914794, 3.916015, 3.917236, 3.918457, 3.919677, 3.920898, 3.922119, 3.923339, 3.92456,  3.925781, 3.927001, 3.928222, 3.929443, 3.930664, 3.931884, 3.933105, 3.934326, 3.935546, 3.936767, 3.937988, 3.939208, 3.940429, 3.94165,  3.942871, 3.944091, 3.945312, 3.946533, 3.947753, 3.948974, 3.950195, 3.951416, 3.952636, 3.953857, 3.955078, 3.956298, 3.957519, 3.95874,  3.95996,  3.961181, 3.962402, 3.963623, 3.964843, 3.966064, 3.967285, 3.968505, 3.969726, 3.970947, 3.972167, 3.973388, 3.974609, 3.97583,  3.97705,  3.978271, 3.979492, 3.980712, 3.981933, 3.983154, 3.984375, 3.985595, 3.986816, 3.988037, 3.989257, 3.990478, 3.991699, 3.992919, 3.99414,  3.995361, 3.996582, 3.997802, 3.999023, 4.000244, 4.001464, 4.002685, 4.003906, 4.005126, 4.006347, 4.007568, 4.008789, 4.010009, 4.01123,  4.012451, 4.013671, 4.014892, 4.016113, 4.017333, 4.018554, 4.019775, 4.020996, 4.022216, 4.023437, 4.024658, 4.025878, 4.027099, 4.02832,  4.029541, 4.030761, 4.031982, 4.033203, 4.034423, 4.035644, 4.036865, 4.038085, 4.039306, 4.040527, 4.041748, 4.042968, 4.044189, 4.04541,  4.04663,  4.047851, 4.049072, 4.050292, 4.051513, 4.052734, 4.053955, 4.055175, 4.056396, 4.057617, 4.058837, 4.060058, 4.061279, 4.0625, 4.06372,  4.064941, 4.066162, 4.067382, 4.068603, 4.069824, 4.071044, 4.072265, 4.073486, 4.074707, 4.075927, 4.077148, 4.078369, 4.079589, 4.08081,  4.082031, 4.083251, 4.084472, 4.085693, 4.086914, 4.088134, 4.089355, 4.090576, 4.091796, 4.093017, 4.094238, 4.095458, 4.096679, 4.0979, 4.099121, 4.100341, 4.101562, 4.102783, 4.104003, 4.105224, 4.106445, 4.107666, 4.108886, 4.110107, 4.111328, 4.112548, 4.113769, 4.11499,  4.11621,  4.117431, 4.118652, 4.119873, 4.121093, 4.122314, 4.123535, 4.124755, 4.125976, 4.127197, 4.128417, 4.129638, 4.130859, 4.13208,  4.1333, 4.134521, 4.135742, 4.136962, 4.138183, 4.139404, 4.140625, 4.141845, 4.143066, 4.144287, 4.145507, 4.146728, 4.147949, 4.149169, 4.15039,  4.151611, 4.152832, 4.154052, 4.155273, 4.156494, 4.157714, 4.158935, 4.160156, 4.161376, 4.162597, 4.163818, 4.165039, 4.166259, 4.16748,  4.168701, 4.169921, 4.171142, 4.172363, 4.173583, 4.174804, 4.176025, 4.177246, 4.178466, 4.179687, 4.180908, 4.182128, 4.183349, 4.18457,  4.185791, 4.187011, 4.188232, 4.189453, 4.190673, 4.191894, 4.193115, 4.194335, 4.195556, 4.196777, 4.197998, 4.199218, 4.200439, 4.20166,  4.20288,  4.204101, 4.205322, 4.206542, 4.207763, 4.208984, 4.210205, 4.211425, 4.212646, 4.213867, 4.215087, 4.216308, 4.217529, 4.21875,  4.21997,  4.221191, 4.222412, 4.223632, 4.224853, 4.226074, 4.227294, 4.228515, 4.229736, 4.230957, 4.232177, 4.233398, 4.234619, 4.235839, 4.23706,  4.238281, 4.239501, 4.240722, 4.241943, 4.243164, 4.244384, 4.245605, 4.246826, 4.248046, 4.249267, 4.250488, 4.251708, 4.252929, 4.25415,  4.255371, 4.256591, 4.257812, 4.259033, 4.260253, 4.261474, 4.262695, 4.263916, 4.265136, 4.266357, 4.267578, 4.268798, 4.270019, 4.27124,  4.27246,  4.273681, 4.274902, 4.276123, 4.277343, 4.278564, 4.279785, 4.281005, 4.282226, 4.283447, 4.284667, 4.285888, 4.287109, 4.28833,  4.28955,  4.290771, 4.291992, 4.293212, 4.294433, 4.295654, 4.296875, 4.298095, 4.299316, 4.300537, 4.301757, 4.302978, 4.304199, 4.305419, 4.30664,  4.307861, 4.309082, 4.310302, 4.311523, 4.312744, 4.313964, 4.315185, 4.316406, 4.317626, 4.318847, 4.320068, 4.321289, 4.322509, 4.32373,  4.324951, 4.326171, 4.327392, 4.328613, 4.329833, 4.331054, 4.332275, 4.333496, 4.334716, 4.335937, 4.337158, 4.338378, 4.339599, 4.34082,  4.342041, 4.343261, 4.344482, 4.345703, 4.346923, 4.348144, 4.349365, 4.350585, 4.351806, 4.353027, 4.354248, 4.355468, 4.356689, 4.35791,  4.35913,  4.360351, 4.361572, 4.362792, 4.364013, 4.365234, 4.366455, 4.367675, 4.368896, 4.370117, 4.371337, 4.372558, 4.373779, 4.375,  4.37622,  4.377441, 4.378662, 4.379882, 4.381103, 4.382324, 4.383544, 4.384765, 4.385986, 4.387207, 4.388427, 4.389648, 4.390869, 4.392089, 4.39331,  4.394531, 4.395751, 4.396972, 4.398193, 4.399414, 4.400634, 4.401855, 4.403076, 4.404296, 4.405517, 4.406738, 4.407958, 4.409179, 4.4104, 4.411621, 4.412841, 4.414062, 4.415283, 4.416503, 4.417724, 4.418945, 4.420166, 4.421386, 4.422607, 4.423828, 4.425048, 4.426269, 4.42749,  4.42871,  4.429931, 4.431152, 4.432373, 4.433593, 4.434814, 4.436035, 4.437255, 4.438476, 4.439697, 4.440917, 4.442138, 4.443359, 4.44458,  4.4458, 4.447021, 4.448242, 4.449462, 4.450683, 4.451904, 4.453125, 4.454345, 4.455566, 4.456787, 4.458007, 4.459228, 4.460449, 4.461669, 4.46289,  4.464111, 4.465332, 4.466552, 4.467773, 4.468994, 4.470214, 4.471435, 4.472656, 4.473876, 4.475097, 4.476318, 4.477539, 4.478759, 4.47998,  4.481201, 4.482421, 4.483642, 4.484863, 4.486083, 4.487304, 4.488525, 4.489746, 4.490966, 4.492187, 4.493408, 4.494628, 4.495849, 4.49707,  4.498291, 4.499511, 4.500732, 4.501953, 4.503173, 4.504394, 4.505615, 4.506835, 4.508056, 4.509277, 4.510498, 4.511718, 4.512939, 4.51416,  4.51538,  4.516601, 4.517822, 4.519042, 4.520263, 4.521484, 4.522705, 4.523925, 4.525146, 4.526367, 4.527587, 4.528808, 4.530029, 4.53125,  4.53247,  4.533691, 4.534912, 4.536132, 4.537353, 4.538574, 4.539794, 4.541015, 4.542236, 4.543457, 4.544677, 4.545898, 4.547119, 4.548339, 4.54956,  4.550781, 4.552001, 4.553222, 4.554443, 4.555664, 4.556884, 4.558105, 4.559326, 4.560546, 4.561767, 4.562988, 4.564208, 4.565429, 4.56665,  4.567871, 4.569091, 4.570312, 4.571533, 4.572753, 4.573974, 4.575195, 4.576416, 4.577636, 4.578857, 4.580078, 4.581298, 4.582519, 4.58374,  4.58496,  4.586181, 4.587402, 4.588623, 4.589843, 4.591064, 4.592285, 4.593505, 4.594726, 4.595947, 4.597167, 4.598388, 4.599609, 4.60083,  4.60205,  4.603271, 4.604492, 4.605712, 4.606933, 4.608154, 4.609375, 4.610595, 4.611816, 4.613037, 4.614257, 4.615478, 4.616699, 4.617919, 4.61914,  4.620361, 4.621582, 4.622802, 4.624023, 4.625244, 4.626464, 4.627685, 4.628906, 4.630126, 4.631347, 4.632568, 4.633789, 4.635009, 4.63623,  4.637451, 4.638671, 4.639892, 4.641113, 4.642333, 4.643554, 4.644775, 4.645996, 4.647216, 4.648437, 4.649658, 4.650878, 4.652099, 4.65332,  4.654541, 4.655761, 4.656982, 4.658203, 4.659423, 4.660644, 4.661865, 4.663085, 4.664306, 4.665527, 4.666748, 4.667968, 4.669189, 4.67041,  4.67163,  4.672851, 4.674072, 4.675292, 4.676513, 4.677734, 4.678955, 4.680175, 4.681396, 4.682617, 4.683837, 4.685058, 4.686279, 4.6875, 4.68872,  4.689941, 4.691162, 4.692382, 4.693603, 4.694824, 4.696044, 4.697265, 4.698486, 4.699707, 4.700927, 4.702148, 4.703369, 4.704589, 4.70581,  4.707031, 4.708251, 4.709472, 4.710693, 4.711914, 4.713134, 4.714355, 4.715576, 4.716796, 4.718017, 4.719238, 4.720458, 4.721679, 4.7229, 4.724121, 4.725341, 4.726562, 4.727783, 4.729003, 4.730224, 4.731445, 4.732666, 4.733886, 4.735107, 4.736328, 4.737548, 4.738769, 4.73999,  4.74121,  4.742431, 4.743652, 4.744873, 4.746093, 4.747314, 4.748535, 4.749755, 4.750976, 4.752197, 4.753417, 4.754638, 4.755859, 4.75708,  4.7583, 4.759521, 4.760742, 4.761962, 4.763183, 4.764404, 4.765625, 4.766845, 4.768066, 4.769287, 4.770507, 4.771728, 4.772949, 4.774169, 4.77539,  4.776611, 4.777832, 4.779052, 4.780273, 4.781494, 4.782714, 4.783935, 4.785156, 4.786376, 4.787597, 4.788818, 4.790039, 4.791259, 4.79248,  4.793701, 4.794921, 4.796142, 4.797363, 4.798583, 4.799804, 4.801025, 4.802246, 4.803466, 4.804687, 4.805908, 4.807128, 4.808349, 4.80957,  4.810791, 4.812011, 4.813232, 4.814453, 4.815673, 4.816894, 4.818115, 4.819335, 4.820556, 4.821777, 4.822998, 4.824218, 4.825439, 4.82666,  4.82788,  4.829101, 4.830322, 4.831542, 4.832763, 4.833984, 4.835205, 4.836425, 4.837646, 4.838867, 4.840087, 4.841308, 4.842529, 4.84375,  4.84497,  4.846191, 4.847412, 4.848632, 4.849853, 4.851074, 4.852294, 4.853515, 4.854736, 4.855957, 4.857177, 4.858398, 4.859619, 4.860839, 4.86206,  4.863281, 4.864501, 4.865722, 4.866943, 4.868164, 4.869384, 4.870605, 4.871826, 4.873046, 4.874267, 4.875488, 4.876708, 4.877929, 4.87915,  4.880371, 4.881591, 4.882812, 4.884033, 4.885253, 4.886474, 4.887695, 4.888916, 4.890136, 4.891357, 4.892578, 4.893798, 4.895019, 4.89624,  4.89746,  4.898681, 4.899902, 4.901123, 4.902343, 4.903564, 4.904785, 4.906005, 4.907226, 4.908447, 4.909667, 4.910888, 4.912109, 4.91333,  4.91455,  4.915771, 4.916992, 4.918212, 4.919433, 4.920654, 4.921875, 4.923095, 4.924316, 4.925537, 4.926757, 4.927978, 4.929199, 4.930419, 4.93164,  4.932861, 4.934082, 4.935302, 4.936523, 4.937744, 4.938964, 4.940185, 4.941406, 4.942626, 4.943847, 4.945068, 4.946289, 4.947509, 4.94873,  4.949951, 4.951171, 4.952392, 4.953613, 4.954833, 4.956054, 4.957275, 4.958496, 4.959716, 4.960937, 4.962158, 4.963378, 4.964599, 4.96582,  4.967041, 4.968261, 4.969482, 4.970703, 4.971923, 4.973144, 4.974365, 4.975585, 4.976806, 4.978027, 4.979248, 4.980468, 4.981689, 4.98291,  4.98413,  4.985351, 4.986572, 4.987792, 4.989013, 4.990234, 4.991455, 4.992675, 4.993896, 4.995117, 4.996337, 4.997558, 4.998779
//};

const static float voctpow[1024] PROGMEM = {
 0,  0.004882, 0.009765, 0.014648, 0.019531, 0.024414, 0.029296, 0.034179, 0.039062, 0.043945, 0.048828, 0.05371,  0.058593, 0.063476, 0.068359, 0.073242, 0.078125, 0.083007, 0.08789,  0.092773, 0.097656, 0.102539, 0.107421, 0.112304, 0.117187, 0.12207,  0.126953, 0.131835, 0.136718, 0.141601, 0.146484, 0.151367, 0.15625,  0.161132, 0.166015, 0.170898, 0.175781, 0.180664, 0.185546, 0.190429, 0.195312, 0.200195, 0.205078, 0.20996,  0.214843, 0.219726, 0.224609, 0.229492, 0.234375, 0.239257, 0.24414,  0.249023, 0.253906, 0.258789, 0.263671, 0.268554, 0.273437, 0.27832,  0.283203, 0.288085, 0.292968, 0.297851, 0.302734, 0.307617, 0.3125, 0.317382, 0.322265, 0.327148, 0.332031, 0.336914, 0.341796, 0.346679, 0.351562, 0.356445, 0.361328, 0.36621,  0.371093, 0.375976, 0.380859, 0.385742, 0.390625, 0.395507, 0.40039,  0.405273, 0.410156, 0.415039, 0.419921, 0.424804, 0.429687, 0.43457,  0.439453, 0.444335, 0.449218, 0.454101, 0.458984, 0.463867, 0.46875,  0.473632, 0.478515, 0.483398, 0.488281, 0.493164, 0.498046, 0.502929, 0.507812, 0.512695, 0.517578, 0.52246,  0.527343, 0.532226, 0.537109, 0.541992, 0.546875, 0.551757, 0.55664,  0.561523, 0.566406, 0.571289, 0.576171, 0.581054, 0.585937, 0.59082,  0.595703, 0.600585, 0.605468, 0.610351, 0.615234, 0.620117, 0.625,  0.629882, 0.634765, 0.639648, 0.644531, 0.649414, 0.654296, 0.659179, 0.664062, 0.668945, 0.673828, 0.67871,  0.683593, 0.688476, 0.693359, 0.698242, 0.703125, 0.708007, 0.71289,  0.717773, 0.722656, 0.727539, 0.732421, 0.737304, 0.742187, 0.74707,  0.751953, 0.756835, 0.761718, 0.766601, 0.771484, 0.776367, 0.78125,  0.786132, 0.791015, 0.795898, 0.800781, 0.805664, 0.810546, 0.815429, 0.820312, 0.825195, 0.830078, 0.83496,  0.839843, 0.844726, 0.849609, 0.854492, 0.859375, 0.864257, 0.86914,  0.874023, 0.878906, 0.883789, 0.888671, 0.893554, 0.898437, 0.90332,  0.908203, 0.913085, 0.917968, 0.922851, 0.927734, 0.932617, 0.9375, 0.942382, 0.947265, 0.952148, 0.957031, 0.961914, 0.966796, 0.971679, 0.976562, 0.981445, 0.986328, 0.99121,  0.996093, 1.000976, 1.005859, 1.010742, 1.015625, 1.020507, 1.02539,  1.030273, 1.035156, 1.040039, 1.044921, 1.049804, 1.054687, 1.05957,  1.064453, 1.069335, 1.074218, 1.079101, 1.083984, 1.088867, 1.09375,  1.098632, 1.103515, 1.108398, 1.113281, 1.118164, 1.123046, 1.127929, 1.132812, 1.137695, 1.142578, 1.14746,  1.152343, 1.157226, 1.162109, 1.166992, 1.171875, 1.176757, 1.18164,  1.186523, 1.191406, 1.196289, 1.201171, 1.206054, 1.210937, 1.21582,  1.220703, 1.225585, 1.230468, 1.235351, 1.240234, 1.245117, 1.25, 1.254882, 1.259765, 1.264648, 1.269531, 1.274414, 1.279296, 1.284179, 1.289062, 1.293945, 1.298828, 1.30371,  1.308593, 1.313476, 1.318359, 1.323242, 1.328125, 1.333007, 1.33789,  1.342773, 1.347656, 1.352539, 1.357421, 1.362304, 1.367187, 1.37207,  1.376953, 1.381835, 1.386718, 1.391601, 1.396484, 1.401367, 1.40625,  1.411132, 1.416015, 1.420898, 1.425781, 1.430664, 1.435546, 1.440429, 1.445312, 1.450195, 1.455078, 1.45996,  1.464843, 1.469726, 1.474609, 1.479492, 1.484375, 1.489257, 1.49414,  1.499023, 1.503906, 1.508789, 1.513671, 1.518554, 1.523437, 1.52832,  1.533203, 1.538085, 1.542968, 1.547851, 1.552734, 1.557617, 1.5625, 1.567382, 1.572265, 1.577148, 1.582031, 1.586914, 1.591796, 1.596679, 1.601562, 1.606445, 1.611328, 1.61621,  1.621093, 1.625976, 1.630859, 1.635742, 1.640625, 1.645507, 1.65039,  1.655273, 1.660156, 1.665039, 1.669921, 1.674804, 1.679687, 1.68457,  1.689453, 1.694335, 1.699218, 1.704101, 1.708984, 1.713867, 1.71875,  1.723632, 1.728515, 1.733398, 1.738281, 1.743164, 1.748046, 1.752929, 1.757812, 1.762695, 1.767578, 1.77246,  1.777343, 1.782226, 1.787109, 1.791992, 1.796875, 1.801757, 1.80664,  1.811523, 1.816406, 1.821289, 1.826171, 1.831054, 1.835937, 1.84082,  1.845703, 1.850585, 1.855468, 1.860351, 1.865234, 1.870117, 1.875,  1.879882, 1.884765, 1.889648, 1.894531, 1.899414, 1.904296, 1.909179, 1.914062, 1.918945, 1.923828, 1.92871,  1.933593, 1.938476, 1.943359, 1.948242, 1.953125, 1.958007, 1.96289,  1.967773, 1.972656, 1.977539, 1.982421, 1.987304, 1.992187, 1.99707,  2.001953, 2.006835, 2.011718, 2.016601, 2.021484, 2.026367, 2.03125,  2.036132, 2.041015, 2.045898, 2.050781, 2.055664, 2.060546, 2.065429, 2.070312, 2.075195, 2.080078, 2.08496,  2.089843, 2.094726, 2.099609, 2.104492, 2.109375, 2.114257, 2.11914,  2.124023, 2.128906, 2.133789, 2.138671, 2.143554, 2.148437, 2.15332,  2.158203, 2.163085, 2.167968, 2.172851, 2.177734, 2.182617, 2.1875, 2.192382, 2.197265, 2.202148, 2.207031, 2.211914, 2.216796, 2.221679, 2.226562, 2.231445, 2.236328, 2.24121,  2.246093, 2.250976, 2.255859, 2.260742, 2.265625, 2.270507, 2.27539,  2.280273, 2.285156, 2.290039, 2.294921, 2.299804, 2.304687, 2.30957,  2.314453, 2.319335, 2.324218, 2.329101, 2.333984, 2.338867, 2.34375,  2.348632, 2.353515, 2.358398, 2.363281, 2.368164, 2.373046, 2.377929, 2.382812, 2.387695, 2.392578, 2.39746,  2.402343, 2.407226, 2.412109, 2.416992, 2.421875, 2.426757, 2.43164,  2.436523, 2.441406, 2.446289, 2.451171, 2.456054, 2.460937, 2.46582,  2.470703, 2.475585, 2.480468, 2.485351, 2.490234, 2.495117, 2.5,  2.504882, 2.509765, 2.514648, 2.519531, 2.524414, 2.529296, 2.534179, 2.539062, 2.543945, 2.548828, 2.55371,  2.558593, 2.563476, 2.568359, 2.573242, 2.578125, 2.583007, 2.58789,  2.592773, 2.597656, 2.602539, 2.607421, 2.612304, 2.617187, 2.62207,  2.626953, 2.631835, 2.636718, 2.641601, 2.646484, 2.651367, 2.65625,  2.661132, 2.666015, 2.670898, 2.675781, 2.680664, 2.685546, 2.690429, 2.695312, 2.700195, 2.705078, 2.70996,  2.714843, 2.719726, 2.724609, 2.729492, 2.734375, 2.739257, 2.74414,  2.749023, 2.753906, 2.758789, 2.763671, 2.768554, 2.773437, 2.77832,  2.783203, 2.788085, 2.792968, 2.797851, 2.802734, 2.807617, 2.8125, 2.817382, 2.822265, 2.827148, 2.832031, 2.836914, 2.841796, 2.846679, 2.851562, 2.856445, 2.861328, 2.86621,  2.871093, 2.875976, 2.880859, 2.885742, 2.890625, 2.895507, 2.90039,  2.905273, 2.910156, 2.915039, 2.919921, 2.924804, 2.929687, 2.93457,  2.939453, 2.944335, 2.949218, 2.954101, 2.958984, 2.963867, 2.96875,  2.973632, 2.978515, 2.983398, 2.988281, 2.993164, 2.998046, 3.002929, 3.007812, 3.012695, 3.017578, 3.02246,  3.027343, 3.032226, 3.037109, 3.041992, 3.046875, 3.051757, 3.05664,  3.061523, 3.066406, 3.071289, 3.076171, 3.081054, 3.085937, 3.09082,  3.095703, 3.100585, 3.105468, 3.110351, 3.115234, 3.120117, 3.125,  3.129882, 3.134765, 3.139648, 3.144531, 3.149414, 3.154296, 3.159179, 3.164062, 3.168945, 3.173828, 3.17871,  3.183593, 3.188476, 3.193359, 3.198242, 3.203125, 3.208007, 3.21289,  3.217773, 3.222656, 3.227539, 3.232421, 3.237304, 3.242187, 3.24707,  3.251953, 3.256835, 3.261718, 3.266601, 3.271484, 3.276367, 3.28125,  3.286132, 3.291015, 3.295898, 3.300781, 3.305664, 3.310546, 3.315429, 3.320312, 3.325195, 3.330078, 3.33496,  3.339843, 3.344726, 3.349609, 3.354492, 3.359375, 3.364257, 3.36914,  3.374023, 3.378906, 3.383789, 3.388671, 3.393554, 3.398437, 3.40332,  3.408203, 3.413085, 3.417968, 3.422851, 3.427734, 3.432617, 3.4375, 3.442382, 3.447265, 3.452148, 3.457031, 3.461914, 3.466796, 3.471679, 3.476562, 3.481445, 3.486328, 3.49121,  3.496093, 3.500976, 3.505859, 3.510742, 3.515625, 3.520507, 3.52539,  3.530273, 3.535156, 3.540039, 3.544921, 3.549804, 3.554687, 3.55957,  3.564453, 3.569335, 3.574218, 3.579101, 3.583984, 3.588867, 3.59375,  3.598632, 3.603515, 3.608398, 3.613281, 3.618164, 3.623046, 3.627929, 3.632812, 3.637695, 3.642578, 3.64746,  3.652343, 3.657226, 3.662109, 3.666992, 3.671875, 3.676757, 3.68164,  3.686523, 3.691406, 3.696289, 3.701171, 3.706054, 3.710937, 3.71582,  3.720703, 3.725585, 3.730468, 3.735351, 3.740234, 3.745117, 3.75, 3.754882, 3.759765, 3.764648, 3.769531, 3.774414, 3.779296, 3.784179, 3.789062, 3.793945, 3.798828, 3.80371,  3.808593, 3.813476, 3.818359, 3.823242, 3.828125, 3.833007, 3.83789,  3.842773, 3.847656, 3.852539, 3.857421, 3.862304, 3.867187, 3.87207,  3.876953, 3.881835, 3.886718, 3.891601, 3.896484, 3.901367, 3.90625,  3.911132, 3.916015, 3.920898, 3.925781, 3.930664, 3.935546, 3.940429, 3.945312, 3.950195, 3.955078, 3.95996,  3.964843, 3.969726, 3.974609, 3.979492, 3.984375, 3.989257, 3.99414,  3.999023, 4.003906, 4.008789, 4.013671, 4.018554, 4.023437, 4.02832,  4.033203, 4.038085, 4.042968, 4.047851, 4.052734, 4.057617, 4.0625, 4.067382, 4.072265, 4.077148, 4.082031, 4.086914, 4.091796, 4.096679, 4.101562, 4.106445, 4.111328, 4.11621,  4.121093, 4.125976, 4.130859, 4.135742, 4.140625, 4.145507, 4.15039,  4.155273, 4.160156, 4.165039, 4.169921, 4.174804, 4.179687, 4.18457,  4.189453, 4.194335, 4.199218, 4.204101, 4.208984, 4.213867, 4.21875,  4.223632, 4.228515, 4.233398, 4.238281, 4.243164, 4.248046, 4.252929, 4.257812, 4.262695, 4.267578, 4.27246,  4.277343, 4.282226, 4.287109, 4.291992, 4.296875, 4.301757, 4.30664,  4.311523, 4.316406, 4.321289, 4.326171, 4.331054, 4.335937, 4.34082,  4.345703, 4.350585, 4.355468, 4.360351, 4.365234, 4.370117, 4.375,  4.379882, 4.384765, 4.389648, 4.394531, 4.399414, 4.404296, 4.409179, 4.414062, 4.418945, 4.423828, 4.42871,  4.433593, 4.438476, 4.443359, 4.448242, 4.453125, 4.458007, 4.46289,  4.467773, 4.472656, 4.477539, 4.482421, 4.487304, 4.492187, 4.49707,  4.501953, 4.506835, 4.511718, 4.516601, 4.521484, 4.526367, 4.53125,  4.536132, 4.541015, 4.545898, 4.550781, 4.555664, 4.560546, 4.565429, 4.570312, 4.575195, 4.580078, 4.58496,  4.589843, 4.594726, 4.599609, 4.604492, 4.609375, 4.614257, 4.61914,  4.624023, 4.628906, 4.633789, 4.638671, 4.643554, 4.648437, 4.65332,  4.658203, 4.663085, 4.667968, 4.672851, 4.677734, 4.682617, 4.6875, 4.692382, 4.697265, 4.702148, 4.707031, 4.711914, 4.716796, 4.721679, 4.726562, 4.731445, 4.736328, 4.74121,  4.746093, 4.750976, 4.755859, 4.760742, 4.765625, 4.770507, 4.77539,  4.780273, 4.785156, 4.790039, 4.794921, 4.799804, 4.804687, 4.80957,  4.814453, 4.819335, 4.824218, 4.829101, 4.833984, 4.838867, 4.84375,  4.848632, 4.853515, 4.858398, 4.863281, 4.868164, 4.873046, 4.877929, 4.882812, 4.887695, 4.892578, 4.89746,  4.902343, 4.907226, 4.912109, 4.916992, 4.921875, 4.926757, 4.93164,  4.936523, 4.941406, 4.946289, 4.951171, 4.956054, 4.960937, 4.96582,  4.970703, 4.975585, 4.980468, 4.985351, 4.990234, 4.995117
};

const static byte gain_table[2][128]PROGMEM = {
 {127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  124,  121,  118,  115,  112,  109,  106,  103,  100,  97, 94, 91, 88, 85, 82, 79, 76, 73, 70, 67, 64, 62, 59, 56, 53, 50, 47, 44, 41, 38, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8,  5,  2,  0,  2,  5,  8,  11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 64, 67, 70, 73, 76, 79, 82, 85, 88, 91, 94, 97, 100,  103,  106,  109,  112,  115,  118,  127},
 {127,  124,  121,  118,  115,  112,  109,  106,  103,  100,  97, 94, 91, 88, 85, 82, 79, 76, 73, 70, 67, 64, 62, 59, 56, 53, 50, 47, 44, 41, 38, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8,  5,  2,  0,  2,  5,  8,  11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 64, 67, 70, 73, 76, 79, 82, 85, 88, 91, 94, 97, 100,  103,  106,  109,  112,  115,  118,  121,  124,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127}
};

void setup()
{
 //  Serial.begin(9600);
 pinMode(2, INPUT_PULLUP);
 pinMode(3, INPUT_PULLUP);
 startMozzi(CONTROL_RATE); // :)
}


void updateControl() {

 //select waveform
 wave_knob = mozziAnalogRead(3);
 if (wave_knob <= 174) {
   wave = 0;
 }
 else if (wave_knob > 174 && wave_knob <= 408) {
   wave = 1;
 }
 else if (wave_knob > 408 && wave_knob <= 612) {
   wave = 2;
 }
 else if (wave_knob > 612 && wave_knob <= 866) {
   wave = 3;
 }
 else if (wave_knob > 866 ) {
   wave = 4;
 }

 //output amp rate
 gain = mozziAnalogRead(4) / 8;

 //OCT toggle SW
 if (digitalRead(3) == 1 && digitalRead(2) == 1) {
   octsw = 2;
 }
 else if (digitalRead(3) == 0 && digitalRead(2) == 1) {
   octsw = 4;
 }
 else {
   octsw = 1;
 }

 //OSC frequency knob
 freq1 = mozziAnalogRead(0) / 4 ;
 freq2 = mozziAnalogRead(1) / 4 ;
 if (abs(freq1 - freq2) <= 1 * octsw) {
   freq2 = freq1;
 }
 else  if (abs(freq1 * 2 - freq2) <= 1 * octsw) {
   freq2 = freq1 * 2;
 }
 else  if (abs(freq1 - freq2 * 2) <= 1 * octsw) {
   freq2 = freq1 / 2;
 }

 //frequency setting
 voct = mozziAnalogRead(7) ;
 //    voct = overSampler.next(voct)*2; //if need more resolution 
 freqv1 = freq1 * pow(2, (pgm_read_float(&(voctpow[voct])))) * octsw; // V/oct apply
 freqv2 = freq2 * pow(2, (pgm_read_float(&(voctpow[voct])))) * octsw; // V/oct apply


 switch (wave) {
   case 0:
     aSaw1.setFreq(freqv1); // set the frequency
     aSaw2.setFreq(freqv2); // set the frequency
     break;

   case 1:
     aSqu1.setFreq(freqv1); // set the frequency
     aSqu2.setFreq(freqv2); // set the frequency
     break;

   case 2:
     aTri1.setFreq(freqv1); // set the frequency
     aTri2.setFreq(freqv2); // set the frequency
     break;

   case 3:
     aSin1.setFreq(freqv1); // set the frequency
     aSin2.setFreq(freqv2); // set the frequency
     break;

   case 4:
     aNis1.setFreq(freqv1); // set the frequency
     aNis2.setFreq(freqv2); // set the frequency
     break;
 }

 //For development
 //  Serial.print(gain);
 //  Serial.print(",");
 //  Serial.print(mozziAnalogRead(4));
 //  Serial.println("");
}

int updateAudio() {
 switch (wave) {
   case 0:
     return MonoOutput::from8Bit(aSaw1.next() * (pgm_read_byte(&(gain_table[0][gain]))) / 256 + aSaw2.next() * (pgm_read_byte(&(gain_table[1][gain]))) / 256);
     break;

   case 1:
     return MonoOutput::from8Bit(aSqu1.next() * (pgm_read_byte(&(gain_table[0][gain]))) / 256 + aSqu2.next() * (pgm_read_byte(&(gain_table[1][gain]))) / 256);
     break;

   case 2:
     return MonoOutput::from8Bit(aTri1.next() * (pgm_read_byte(&(gain_table[0][gain]))) / 256 + aTri2.next() * (pgm_read_byte(&(gain_table[1][gain]))) / 256);
     break;

   case 3:
     return MonoOutput::from8Bit(aSin1.next() * (pgm_read_byte(&(gain_table[0][gain]))) / 256 + aSin2.next() * (pgm_read_byte(&(gain_table[1][gain]))) / 256);
     break;

   case 4:
     return MonoOutput::from8Bit(aNis1.next() * (pgm_read_byte(&(gain_table[0][gain]))) / 256 + aNis2.next() * (pgm_read_byte(&(gain_table[1][gain]))) / 256);
     break;
 }

}


void loop() {
 audioHook(); // required here
}

この記事が気に入ったらサポートをしてみませんか?