2016/08/27 (Sat) 16:05
K-Shoot MANIA v1.63beta (ベータ版)

近日公開を予定しているK-Shoot MANIA v1.63のベータ版を配布します。
開発中のバージョンのため、予期しない不具合が発生する可能性があります。
不具合が生じた場合はTwitter(@masaka_k)またはブログのコメント欄に報告してくださると助かります。

また、必ずK-Shoot MANIA v1.62を導入してから入れるようにしてください。

変更点
 ・プレイ中、音が流れなくなることがある問題を改善
 ・リザルト画面でのツイート機能を追加
  (リザルト画面で画面右上をクリックするかF11キーを押してください。
   初回のみ、認証のためブラウザが起動します。)


<使用方法>
ファイルを既存のK-Shoot MANIA v1.62と同じフォルダ内に上書き保存してください。
kshootmania_v163beta.exeを実行するとゲームが起動します。

<取り扱いについて>
本ファイルの取り扱いについては、K-Shoot MANIA最新版のreadme.txtに記載の注意事項にならいます。
許諾の有無にかかわらず、一切の再配布を禁止いたします。

<ダウンロード>
 →こちら



2016/07/09 (Sat) 22:55
[K-Shoot MANIA v1.60] ユーザー定義エフェクトの作成方法

K-Shoot MANIA v1.60以降では外部ソフトウェア(REAPER)によるエフェクト書き出しが不要になったため、
譜面データの配布にはmp3ファイルと譜面ファイルのみで良くなりました。
そのほか、FXエフェクト・LASER音声エフェクトをユーザー側で定義することができるようになりました。

本記事では、このユーザー定義エフェクトの作成方法について説明します。

重要: v1.60cより前のバージョンのエディタにはユーザー定義エフェクトの記述が正常に読み込み・保存されないことがある不具合が存在します。
ユーザー定義エフェクトを使用する際はv1.60c以降のバージョンのエディタを使用することを強くお勧めします。




1. ユーザー定義エフェクトとは?


ユーザー定義エフェクトは、既存のエフェクトのパラメータを変更したものを新しいエフェクトとして定義し、譜面内で指定できるようにするものです。例えば、「低い音のFlangerエフェクト」や「2拍おきではなく4拍おきに更新されるRetriggerエフェクト」などに名前をつけて、エディタ上で指定できるようにできます。



2. 基本的な定義方法

ユーザー定義エフェクトの指定方法は以下の2種類です。
kshファイルをテキストエディタで開き、ファイルの一番最後にユーザー定義エフェクト指定を記述します。

●FXエフェクト:

  #define_fx [ユーザー定義エフェクト名] type=[エフェクトの名称];[パラメータ名]=[値]

●LASER音声エフェクト:
  #define_filter [ユーザー定義エフェクト名] type=[エフェクトの名称];[パラメータ名]=[値]


[ユーザー定義エフェクト名]にはエディタ上で表示されるエフェクト名を自由に入力します。
既存のFXエフェクト名は「Re」「Flan」といった名称なので、例えばFXエフェクトとして低いFlangerエフェクトを作成した場合は「LoFl」など、4文字以内(頭文字が大文字で他は小文字)で指定することをオススメします。
また、既存のLASER音声エフェクト名は「PEAK」「LPF」「HPF」といった名称なので、例えばLASER音声エフェクトとして16分Retriggerを作成した場合は「RE16」など、すべて大文字の名前で指定することをオススメします。
なお、ユーザー定義エフェクト名に日本語は使用できません(たぶん)。

[エフェクトの名称]は以下の11種類から1つ選んで入力して下さい。
  • Retrigger
  • Gate
  • Flanger
  • PitchShift
  • BitCrusher
  • Phaser
  • Wobble
  • TapeStop
  • Echo
  • SideChain
  • SwitchAudio

「[パラメータ名]=[値]」の部分では各エフェクトのパラメータを変更できます。
指定できるパラメータの種類は各エフェクトの種類ごとに異なります。
なお、「[パラメータ名]=[値]」は「;」(半角セミコロン)で区切ることで、いくつでも記述することができます。
例えば、以下のように記述できます。

●例 (低い音のFlangerエフェクト) :
  #define_fx LoFl type=Flanger;delay=80samples;depth=60samples

各エフェクトの種類に対して指定できるパラメータは何種類かありますが、ここで記述されなかったパラメータに関しては標準値が使用されます。
すなわち「#define_fx LoFl type=Flanger」とだけ書けば、通常のFlangerと全く同じエフェクトとなります。

3. パラメータの値の型(単位)

エフェクトの各パラメータにはそれぞれ型(単位)が決まっており、それ以外の型で値を指定することはできません。
例えば、時間の長さを指定する場合には「1/16」「150ms」といった値は許されても、「50%」といった値は単位が合わないため使用できません。
パラメータの値の型は以下の10種類です。
  • [INT] … 整数を指定します (例)「10」

  • [RATE] … 率を指定します
         「1/*」「*%」「0.*」の3種類の指定方法があります (例) 「1/2」「50%」「0.5」

  • [SAMPLE]…人間が認知できないほどの非常に短い時間を指定します
          サンプリング周波数44100Hzを基準にしたときのサンプル数を指定します
          (つまり 44100samples=1秒 となります)
          指定方法は「*samples」のみで、*には整数が入ります
          (例)「40samples」

  • [LENGTH]…時間の長さを指定します
          指定方法は「1/*」「0.*」「*ms」「*s」の4種類で、はじめの2つは1小節の倍数で指定します。
          この場合はBPMに依存します。1.0以上の小数を指定することもできます。
          最後の2つはそれぞれミリ秒、秒の単位で指定します(この指定方法ができないものもあります)。
          (例)「1/4」「0.25」「100ms」「0.1s」

  • [SWITCH]…「on」か「off」のいずれかのみを指定します        

  • [FREQ]…周波数を指定します
         指定方法は「*Hz」「*kHz」の2種類があります。
         (例)「12500Hz」「12.5kHz」

  • [FLOAT]…小数を指定します
         (例)「2.5」

  • [dB] … 音の大きさの倍率を指定します
         指定方法は「*dB」のみです。*には小数が入ります。
         (例)「-3.0dB」

  • [PITCH] … 音の高さを表します。12で1オクターブです。
         (例)「12.0」「-6」

  • [FILENAME]…ファイル名を指定します
           (例)「hitsuji.mp3」「kaeru.ogg」


4. パラメータの値の変化について

各パラメータの値は、FXエフェクトでは「(その種類のロングFXを)押していないとき」と「押したとき」の2つ、
LASER音声エフェクトでは「判定が外れているとき」「既定位置にあるとき」「最も端の位置にあるとき」の3つを指定してプレイ中に値を変化させることができます。
指定方法は、FXエフェクトの場合は「0%>100%」というように「>」で区切ることで「押していないとき」から「押したとき」への変化が指定できます。
また、LASER音声エフェクトの場合は「0%>50%-100%」というように「>」に加えて「-」で区切ることで変化が表せます。この場合は「判定が外れているとき」が「0%」で、既定位置から逆側にかけて「50%」~「100%」の間をなめらかに値が変化していきます。

なお、単に「0%」と指定すれば「0%>0%」あるいは「0%>0%-0%」と同じ意味になり、LASER音声エフェクトの場合でも「0%>100%」と指定すれば「0%>100%-100%」と指定したことと同じ意味、「0%-100%」と指定すれば「0%>0%-100%」と指定したことと同じ意味になります。

9種類の型のうち、[FILENAME]のみはプレイ中に値を変化させることができません。

なお、多くのエフェクトには元の音声との混ぜ具合(エフェクトをかける強さ)を示す「mix」パラメータが存在し、これを0%にするとエフェクトがかかっていない状態となり、「100%」とすると最も強くエフェクトがかかった状態になります。
標準では「mix=0%>100%」など、押していないときには「0%」となる指定になっており、これによりその種類のロングFXオブジェクトを押していないときにはエフェクトがかからないようになっています。
例えば、これを「mix=100%」としてしまうと、その種類のロングFXオブジェクトを押していないときでもエフェクトがかかってしまいます(ただし、種類にかかわらずロングFXオブジェクトを一つも押していない状態では、すべてのエフェクトはByPass(無効の状態)となっています)。



5. エフェクト&各パラメータの種類とその標準値

ここでは各パラメータの名前とその値の型を「パラメータ名[型](=標準値)」の形式で紹介します。
  • Retrigger … 音を繰り返すエフェクトです。updatePeriodごと、あるいはupdateTriggerがonになる度に繰り返し元を更新します。
    • updatePeriod[LENGTH](=1/2): 繰り返し元を自動更新する間隔を指定します(s/ms単位不可)
                          0にすると自動更新を無効にします
    • waveLength[LENGTH]: 繰り返す間隔を指定します(FXエフェクトではノーツごとに指定されるため不要)
    • rate[RATE](=70%): 音の長さを指定します。100%にすると完全に繰り返し、下げていくと音が細切れになります。
    • updateTrigger[SWITCH](=off): onになった瞬間、繰り返し元を更新します(onになってもすぐにoffに戻ります)
    • mix[RATE](=0%>100%): 元音源とエフェクト音源の混ぜ具合を指定します

  • Gate … 定期的に音量を100%⇔0%で行き来させることで、音が細切れになるエフェクトです。
    • waveLength[LENGTH]: 音量変化の間隔を指定します(FXエフェクトではノーツごとに指定されるため不要)
    • rate[RATE](=60%): 音の長さを指定します。100%にすると元音源のままで、下げていくと音が細切れになります。
    • mix[RATE](=0%>90%): 元音源とエフェクト音源の混ぜ具合を指定します

  • Flanger … 元音源と同じ音を遅らせて重ねます。ディレイタイムをLFOで揺らすことで、音にうねりを与えます。
    • period[LENGTH](=2.0): LFOの周期を指定します
    • delay[SAMPLE](=30samples): ディレイタイムの最小値を指定します(~44100samples)。大きくするほど低い音になります。
    • depth[SAMPLE](=45samples): ディレイタイムの変化の深さを指定します(~44100samples)。大きくするほど音の高低差が大きくなります。
    • feedback[RATE](=60%): フィードバック率を指定します。ディレイ先へエフェクト済の音を渡してエフェクトを強くします。
    • stereoWidth[RATE](=0%): L/Rチャンネル間のLFOのずらし具合を指定します。
    • volume[RATE](=75%): 音量を調節します。干渉により音量が大きくなるため、標準では少し下げています。
    • mix[RATE](=0%>80%): 元音源とエフェクト音源の混ぜ具合を指定します

  • PitchShift … 音の高さを変更します。chunkSizeごとに波形を区切り、その区間内で波形を伸縮させます。
    • pitch[PITCH]: 音程を指定します(-48~48)。レーザーの推移では、両方の値を整数で指定すると値が整数のみを経由して推移、小数で指定すると値がなめらかに推移するようになります(すなわち「0-12」ではピロロロ↑、「0.0-12.0」ではヒューン↑のような感じ)。
    • chunkSize[SAMPLE](=700samples): 区間の幅を指定します。大きくするほど音質は上がりますが、音が遅れます。
    • overWrap[RATE](=40%): 区間の拡縮後にクロスフェードによってサンプルをなめらかにつなげる割合を指定します(0%~50%)。大きくするとなめらかな音になりますが、波形の干渉により音が変化する可能性があります。
    • mix[RATE](=0%>100%): 元音源とエフェクト音源の混ぜ具合を指定します

  • BitCrusher … 波形を階段状にして音質を落とします。値を変化させるとバリバリという音がします。
    • reduction[SAMPLE](=0samples): 無視サンプル数を指定します。上げるほど音質が下がります。(FXではノーツ上指定のため不要)
    • mix[RATE](=0%>100%): 元音源とエフェクト音源の混ぜ具合を指定します

  • Phaser … 波形の位相をずらすAll-pass Filterをかけた音と元の音を重ねて干渉させます。
    • period[LENGTH](=1/2): LFOの周期を指定します
    • stage[INT](=6): 作用させるAll-pass Filterの数を指定します(0~12)。原理上、偶数のみ指定できます。大きくすると処理が重くなります。
    • loFreq[FREQ](=1500Hz): All-pass Filterの最小周波数を指定します(10Hz~20000Hz)
    • hiFreq[FREQ](=20000Hz): All-pass Filterの最大周波数を指定します(10Hz~20000Hz)
    • Q[FLOAT](=0.707): All-pass FilterのQ値を指定します(0.1~50.0)。ここでは小さくするほど鋭い音になります。
    • feedback[RATE](=35%): フィードバック率を指定します。All-pass Filterの手前へエフェクト済の音を渡してエフェクトを強くします。
    • stereoWidth[RATE](=0%): L/Rチャンネル間のLFOのずらし具合を指定します。
    • hiCutGain[dB](=-8.0dB): loFreqとhiFreqの中央より高い周波数の音をカットする量を指定します(~0.0dB)。
    • mix[RATE](=0%>50%): 元音源とエフェクト音源の混ぜ具合を指定します。一般的なPhaserエフェクトはMix値50%で最も干渉するというものが多いですが、ここでは利便性から100%で最もよく干渉する(エフェクトが強くかかる)ようにしています。

  • Wobble … 低音のみを通すLow-pass Filterのカットオフ周波数をLFOで揺らすことでヒュワヒュワという音にします。
    • waveLength[LENGTH]: LFOの周期を指定します
    • loFreq[FREQ](=500Hz): Low-pass Filterの最小周波数を指定します(10Hz~20000Hz)
    • hiFreq[FREQ](=20000Hz): Low-pass Filterの最大周波数を指定します(10Hz~20000Hz)
    • Q[FLOAT](=1.414): Low-pass FilterのQ値を指定します(0.1~50.0)。ここでは大きくするほどカットオフ周波数周辺が強調され鋭い音になります。
    • mix[RATE](=0%>50%): 元音源とエフェクト音源の混ぜ具合を指定します

  • TapeStop … 音を減速させることでターンテーブルで音を止めたように聞こえさせるエフェクトです。
    • speed[RATE](=50%): 減速の速さを指定します。
    • trigger[SWITCH](=off>on):onになった瞬間から減速をはじめ、offになると再生速度を元に戻します。
    • mix[RATE](=0%>100%): 元音源とエフェクト音源の混ぜ具合を指定します

  • Echo … Retriggerにフェードアウトを追加したエフェクトです。音がこだましたような効果を生みます。
    • updatePeriod[LENGTH](=0): 繰り返し元を自動更新する間隔を指定します(s/ms単位不可)
                         0にすると自動更新を無効にします
    • waveLength[LENGTH]: 繰り返す間隔を指定します(FXエフェクトではノーツごとに指定されるため不要)
    • updateTrigger[SWITCH](=off>on): onになった瞬間、繰り返し元を更新します(onになってもすぐにoffに戻ります)
    • feedbackLevel[RATE](=60%): 音量の保持率を指定します。小さくするとはやくフェードアウトします。(FXエフェクトではノーツごとに指定されるため不要)
    • mix[RATE](=0%>100%): 元音源とエフェクト音源の混ぜ具合を指定します

  • SideChain … 一般にはほかのトラックの信号を元にエフェクトを作用させることを指しますが、ここでのSideChainエフェクトはサイドチェインコンプレッサーとしての使用法の再現で、周期的に音を圧縮するものです。
    • period[LENGTH](=1/4): 圧縮の周期を指定します(s/ms単位不可)。0にすると無効にします。
    • holdTime[LENGTH](=50ms): コンプレッサーに与えられる波形がThreshold値を上回っていることを再現する時間の長さを指定します
    • attackTime[LENGTH](=10ms): 音の圧縮を最大にするまでにかける時間を指定します
    • releaseTime[LENGTH](=1/16): 圧縮をもとに戻すまでにかける時間を指定します
    • ratio[INT](=1>5): 音の圧縮率を指定します(1~100)。1を指定すると1/1倍(すなわち原音)、5を指定すると1/5倍まで圧縮します。

  • SwitchAudio … 再生音源を別の音声ファイルに切り替えます。切り替え先音声は元音声と同じ長さであることが推奨されます。
    • fileName[FILENAME]: 切り替え先音声のファイル名を指定します


    6. 実際にやってみよう

    まずはテキストエディタでkshファイルを開きます。ユーザー定義エフェクトはファイルの終端に記述します。

    userfx_001.png

    例えば、最初に挙げた例の低い音のFlangerエフェクト(LoFl)を指定してみます。
    userfx_002.png

    書き終わったらkshファイルを上書き保存し、K-Shoot Editorで開きます。
    すると、他の既存のエフェクトと同じようにCtrl+クリックでユーザー定義エフェクトも選ぶことができるようになっています。

    userfx_003.png

    LASER音声エフェクトに関しても同様に、例えば以下のようなレーザーの横位置に合わせてFlangerが作用するようなエフェクトを記述するとすれば、

      #define_filter LOFL type=Flanger;delay=80samples-140samples;depth=0samples

    これを例によってテキストエディタで追記すると、

    userfx_004.png

    エディタで再度譜面ファイルを開き直せば、他の既存のLASER音声エフェクトの種類と同様にCtrl+クリックで変更できるようになっています。

    userfx_005.png

    「譜面に関する設定」で旧バージョンのように音声ファイルを2つ以上指定している場合、内部エラー7が出るようです(v1.60b現在)。次のバージョンで修正します。とほほ v1.60cで修正しました

    7. 何言ってるかさっぱりわからん!どうでもいいから例をくれ例を!

    という方のために、エフェクト例を挙げておきます。


    ●FXエフェクト:

    □ 2小節毎に更新するRetriggerエフェクト
      #define_fx 2R type=Retrigger;updatePeriod=2.0;rate=100%
    これをロングFXに指定した上でShift+クリックを押し、間隔を1/1に指定すれば奇数小節を丸々1小節繰り返すことができます。

    □ 押した地点で繰り返し元を更新するRetriggerエフェクト
      #define_fx *R type=Retrigger;updatePeriod=0;updateTrigger=off>on

    □ いつもより細切れなGateエフェクト
      #define_fx SG type=Gate;rate=30%

    □ いつもより控えめなGateエフェクト
      #define_fx WG type=Gate;mix=0%>50%

    □ いつもより低い音で、かつ左右で位相のずれたFlangerエフェクト
      #define_fx LSFl type=Flanger;delay=80samples;depth=60samples;stereoWidth=100%

    □ めっちゃ鋭いWobbleエフェクト
      #define_fx SW type=Wobble;Q=4.0

    □ 音声を切り替えるエフェクト
      #define_fx SwA1 type=SwitchAudio;fileName=kaeru_f1.mp3
    #define_fx SwA2 type=SwitchAudio;fileName=kaeru_f2.mp3
      (最大32個指定できます)

    ●LASER音声エフェクト:

    □ 横位置によって速度の変わるRetriggerエフェクト
      #define_filter RETR type=Retrigger;waveLength=1/4-1/16

    □ 横位置によって速度の変わるGateエフェクト
      #define_filter GATE type=Gate;waveLength=1/4-1/16

    □ 横位置によってLFO周期の変わるFlangerエフェクト
      #define_filter FLAN_P type=Flanger;period=1/8-1/128;depth=200samples;delay=40samples;feedback=100%;stereoWidth=100%

    □ いつもより控えめなBitCrusherエフェクト
      #define_filter WBITC type=BitCrusher;reduction=0samples-20samples
     (ちなみに普通のBITCは reduction=0samples-30samples です)

    □ 判定が入ると減速するTapeStopエフェクト
      #define_filter TSTP type=TapeStop;trigger=off>on;speed=20%

    □ 端にいくにつれて聞こえてくるWobbleエフェクト
      #define_filter WOBBLE type=Wobble;mix=0%-100%;waveLength=1/12

    □ 横位置によって音程が変わるPitchShiftエフェクト
      #define_filter PITC type=PitchShift;pitch=0.0-12.0

    □ 音声を切り替えるエフェクト
      #define_filter SWA1 type=SwitchAudio;fileName=kaeru_f1.mp3
    #define_filter SWA2 type=SwitchAudio;fileName=kaeru_f2.mp3
      (最大32個指定できます)

    8. さらに高度な使い方

    kshファイル内の任意の場所に「fx:[ユーザー定義エフェクト名]:[パラメータ名]=[値]」または「filter:[ユーザー定義エフェクト名]:[パラメータ名]=[値]」という行を追加すると、その位置でユーザー定義エフェクトのパラメータの値を変更することができます。

    例えば、Retriggerエフェクトで任意の位置から音を持って来たいときなどに応用できます。
    更新をオフにした以下のようなRetriggerエフェクトを定義し、
      #define_fx SR type=Retrigger;updatePeriod=0

    繰り返し元にしたい箇所に
      fx:SR:updateTrigger=on

    という行を追加すれば、自由な位置から波形を引っ張ってくることができます。

    また、判定が入っていないときにはByPass(エフェクトオフ)となることから、既存のレーザー音声エフェクト(例えばHPF)と同時にGateエフェクトを鳴らしたい、といった場合にも使うことができます。この場合は、Gateエフェクトを定義した上で、
      #define_filter GA16 type=Gate;waveLength=1/16

    通常のLASER音声エフェクトと同時にGateをかけたい場所に
      filter:GA16:mix=90%
    という行を追加し、やめたいところで
      filter:GA16:mix=0%

    と記述して下さい(mixを0%にしないとずっとかかったままになります)。

    なお、ゲーム本体では「譜面内で一度もロングFXの種類あるいはレーザー音声エフェクトの種類に指定されていない」かつ「譜面内で一度もエフェクト変更の記述がない」エフェクトを無視しています。これはパフォーマンスの低下を防ぐ目的です。
    そのため、例えばmixがずっと100%のエフェクトを定義しただけではずっとかかってくれません(エディタ上ではかかります)。



    以上です。
    長くてすみません・・・

    (2016/07/14) 一部エフェクト例の誤りを修正しました。
    (2016/07/22) v1.61で搭載されたPitchShiftエフェクトについての記述を追加しました。
    (2016/08/17) v1.62での標準値などの変更箇所を修正、PitchShiftエフェクトの記述漏れを修正
    (2016/08/20) 一部エフェクト例の誤りを修正しました。
    (2016/12/03) 一部エフェクト例を修正しました。
    (2017/02/11) EchoエフェクトのupdateTriggerの標準値の誤りを修正しました。
    (2017/07/10) Retriggerエフェクトのrateの標準値の誤りを修正しました。



2016/07/02 (Sat) 20:57
[C言語] LFOの周波数の値を対数スケールで動かしたいときの覚え書き

フィルター系エフェクターにLFOから値を与えてやりたいとき, 周波数の値を線形推移させると,
低音域をあっさり通過してなんかショボいかかり具合になりがちです.

というわけで多くの場合, 周波数は対数のスケールで値を動かしていくわけですが,
実際にどうやってその値を出すのかは調べても出てこなかったので, 半分自分用のメモとして書き残しときます.


例えば,
  float型変数now: LFOの現在値(0.0f~1.0f)
  float型変数freq_min, freq_max: 周波数の最小値, 最大値
とした場合,

  float base = 10.0f; // 底
float min = logf(freq_min) / logf(base); // 対数における最小
float max = logf(freq_max) / logf(base); // 対数における最大
float freq = powf(base, min + (max - min) * now); // 計算結果

で求めたい周波数freqが求められます(※math.hのincludeが必要).
今回は周波数の推移を想定しているので, 最小値に0を指定できない点に注意して下さい.



この方法で推移させると線形変化させた時に比べ低周波数の領域をゆっくり推移し,
人間の聴覚上ではまっすぐ変化したように感じさせることができます.



<追記> 上だと使いにくそうなので関数の形も載せておきます(ご自由にお使い下さい).
float getFreq(float now, float freq_min, float freq_max, float base) {
  float min = logf(freq_min);
  float max = logf(freq_max);
  return powf(base, (min + (max - min) * now) / logf(base));
}

サンプルプログラム(0.0~1.0の値を与えると10.0~5000.0の値を返します):
#include <stdio.h>
#include <math.h>

float getFreq(float now, float freq_min, float freq_max, float base) {
  float min = logf(freq_min) / logf(base);
  float max = logf(freq_max) / logf(base);
  return powf(base, min + (max - min) * now);
}

int main(){
  float now, result;
  while (1){
    printf("■0.0~1.0の値を入力: ");
    scanf("%f", &now);
    if ((now<0.0f) || (now>1.0f)) break;
    result = getFreq(now, 10.0f, 5000.0f, 10.0f);
    printf("結果: %.5f\n", result);
  }
  return 0;
}

サンプルプログラムの実行例:
サンプルプログラムの実行例

ご覧の通り, 小さい値を推移することがわかります.
1.0の結果で4999.99805となるように, 対数を経由するために計算に誤差が生じます.
計算精度が必要な場合はdouble型を使用して下さい.

double型を使用したサンプルプログラム:
#include <stdio.h>
#include <math.h>

double getFreq(double now, double freq_min, double freq_max, double base) {
  double min = log(freq_min);
  double max = log(freq_max);
  return pow(base, (min + (max - min) * now) / log(base));
}

int main(){
  double now, result;
  while (1){
    printf("■0.0~1.0の値を入力: ");
    scanf("%lf", &now);
    if ((now<0.0) || (now>1.0)) break;
    result = getFreq(now, 10.0, 5000.0, 10.0);
    printf("結果: %.5f\n", result);
  }
  return 0;
}

double型使用時の実行例:
double型使用時の実行例



| ホーム |

前のページ «  ホーム  » 次のページ