cross_entropy_error

#ロードバイク #山形

ZWIFTのワークアウトをテキストエディタで自作する方法

COVID19の影響からZWIFTを使う機会が増えています。
ワークアウトを自作したい場合は,ZWIFTのGUIベースで作成ができますが,インターバルのブロックをドラッグ・アンド・ドロップして強度と時間を指定して・・・と, 30秒のインターバルを何度も繰り返すワークアウトを作る際は、とても大変です。

まぁぶっちゃけかったるい。

ので,このワークアウトファイル(.ZWO)をVScodeで開いてみたところ,容易に編集できる事がわかりましたので,ここに残しておこうと思います。

テキストベースで編集できるメリット・活用場面

  1. ZWIFTのゲーム画面(GUI)の煩わしい作業を伴わず,長時間のメニューをテキスト編集で作成できる。
  2. ワークアウト中に表示するテキストイベントを文字数制限なしで編集できる。
  3. ミートアップ時にテキストチャットを送らなくても、参加者とワークアウトファイルをシェアして、ストレスフリーにミートアップ!とかね

ワークアウトファイル(.ZWO)の保存先

 ZWIFTのワークアウトファイル(.ZWO)は,Windowsで通常のインストールを行った場合は,ユーザーのドキュメントファイルに保存されている。

C:\Users\hogehoge\Documents\Zwift\Workouts

ワークアウトファイル(.ZWO)を編集する。

保存されているワークアウトファイル(.ZWO)をテキストエディタで開きます。 
開くとこんな感じです。

<workout_file>  
<author>hogehoge</author>
<name>rainy day</name>
<description></description>
<sportType>bike</sportType>
<tags/>
<workout>
    <SteadyState Duration="600" Power="0.5" pace="1128505344">
        <textevent timeoffset="29" message="Let&apos;s suffer for about two hours. Don&apos;t forget to stay hydrated!"/>
        <textevent timeoffset="480" message="5 intervals after 10 minutes (4.0 W/kg for 4 minutes, rest for 2 minutes)"/>
    </SteadyState>
    <SteadyState Duration="240.00002" Power="0.89999998" pace="1128505344"/>
    <SteadyState Duration="120.00001" Power="0.5" pace="1128505344">
        <textevent timeoffset="0" message="Okay, 2-minute rest."/>
    </SteadyState>
    <SteadyState Duration="240.00002" Power="0.89999998" pace="1128505344"/>
    <SteadyState Duration="120.00001" Power="0.5" pace="1128505344"/>
    <SteadyState Duration="240.00002" Power="0.89999998" pace="1128505344"/>
    <SteadyState Duration="120" Power="0.50187498" pace="1128505344"/>
    <SteadyState Duration="240.00002" Power="0.89999998" pace="1128505344"/>
    <SteadyState Duration="120.00001" Power="0.5" pace="1128505344"/>
    <SteadyState Duration="240" Power="0.90187496" pace="1128505344"/>
    <SteadyState Duration="120.00001" Power="0.5" pace="1128505344">
        <textevent timeoffset="0" message="Okay, 5-minute rest."/>
    </SteadyState>
    <SteadyState Duration="180.00002" Power="0.5" pace="1128505344">
        <textevent timeoffset="120" message="8 intervals after 1 minute (2 minutes FTP, 30 seconds 5.3-5.5 W/kg)"/>
    </SteadyState>
    <SteadyState Duration="120.00001" Power="1" pace="1128505344"/>
    <SteadyState Duration="30.000002" Power="1.21" pace="1128505344"/>
    <SteadyState Duration="120.00001" Power="1" pace="1128505344"/>
    <SteadyState Duration="30.000002" Power="1.21" pace="1128505344"/>
    <SteadyState Duration="120.00001" Power="1" pace="1128505344"/>
    <SteadyState Duration="30" Power="1.21" pace="1128505344"/>
    <SteadyState Duration="120.00001" Power="1" pace="1128505344"/>
    <SteadyState Duration="30.000002" Power="1.21" pace="1128505344"/>
    <SteadyState Duration="120.00001" Power="1" pace="1128505344"/>
    <SteadyState Duration="30.000002" Power="1.21" pace="1128505344"/>
    <SteadyState Duration="120.00001" Power="1" pace="1128505344"/>
    <SteadyState Duration="30.000002" Power="1.21" pace="1128505344"/>
    <SteadyState Duration="120.00001" Power="1" pace="1128505344"/>
    <SteadyState Duration="30.000002" Power="1.21" pace="1128505344"/>
    <SteadyState Duration="120.00001" Power="1" pace="1128505344"/>
    <SteadyState Duration="30.000002" Power="1.21" pace="1128505344"/>
    <SteadyState Duration="300" Power="0.5" pace="1128505344">
        <textevent timeoffset="0" message="Okay, 7-minute rest."/>
    </SteadyState>
    <SteadyState Duration="120.00001" Power="0.5" pace="1128505344">
        <textevent timeoffset="60" message="5 intervals after 1 min (6W/kg , 5.0W/kg , rest, 1 min each)"/>
    </SteadyState>
    <SteadyState Duration="60.000004" Power="1.33" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="1.08" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="0.5" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="1.33" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="1.08" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="0.5" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="1.33" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="1.08" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="0.5" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="1.33" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="1.08" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="0.5" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="1.33" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="1.08" pace="1128505344"/>
    <SteadyState Duration="60.000004" Power="0.5" pace="1128505344">
        <textevent timeoffset="0" message="Okay, 5-minute rest."/>
    </SteadyState>
    <SteadyState Duration="300" Power="0.5" pace="1128505344">
        <textevent timeoffset="240" message="Finally, a 10 minute FTP run."/>
    </SteadyState>
    <SteadyState Duration="600" Power="1.0044999" pace="1128505344"/>
    <SteadyState Duration="600" Power="0.5" pace="1128505344">
        <textevent timeoffset="5" message="Finish the workout and cool down for 10 minutes."/>
    </SteadyState>
</workout>
</workout_file>

このメニューは約2時間の内容で細かいインターバルが連続します。ZWIFTのゲーム上でこれを作るのは大変ですが、テキストエディタならコピペで簡単に作成していくことができますね。

編集時のポイント

以下は、上記のファイルの重要な部分のみを抜粋しています。

<workout>
    <SteadyState Duration="600" Power="0.5" pace="1128505344">
        <textevent timeoffset="29" message="Let's suffer for about two hours. Don't forget to stay hydrated!"/>
        <textevent timeoffset="480" message="5 intervals after 10 minutes (4.0 W/kg for 4 minutes, rest for 2 minutes)"/>
    </SteadyState>
    <SteadyState Duration="240.00002" Power="0.89999998" pace="1128505344"/>  

"SteadyState"タグは各インターバル時のブロックの内容を表しています。"Duration"は時間を秒で指定、"Power"は指定パワーをFTPの何倍にするかを指定していますね。

つまり、上記の2行目の"SteadyState"タグでは、「600秒(10分)をFTPの0.5倍で。」と指定しているわけです。序盤のウォームアップです。

3行目の"textevent"はワークアウト中に画面の真ん中に表示されるテキストメッセージの内容を指定できます。ミートアップで全員が同じワークアウトするときなんかは、非常に便利です。"timeoffset"はインターバル開始から何秒後に表示するかを指定できます。上の場合は、この600秒のブロックが開始されてから、29秒後の表示に指定していますね。

message="Let's suffer for about two hours. Don't forget to stay hydrated!"

最強翻訳DeepL翻訳で翻訳してみましょう。

2時間ほど苦しみましょう。水分補給を忘れずに!

f:id:katoo-post:20200517010555p:plain

あとは編集を完了したファイル(.ZWO)を保存して、Zwiftを開けば、自作ワークアウトが選択できます。

f:id:katoo-post:20200517010552p:plain

"#StayhomeStayfit"でにわかに注目されているZWIFTを自分のトレーニングプランにあったメニューで苦しみましょう。