【ライブレポ】TOMOO×水咲加奈 ツーマンライブ 僕らどこへでもゆける

ライブ情報

【開催日時】
2021年3月2日(火)

【開催場所】
下北沢440(four forty)

ツイキャスプレミアムによる同時生配信あり
(アーカイブ期間:3/2~3/16)

【出演者】
TOMOO(Vo & Pf)
水咲加奈(Vo & Pf)



私がTOMOOさんの有料ライブを視聴するのは、昨年9月の無観客配信ライブ以来です。
配信ライブは遠方の人間にとって非常にありがたいと思う反面、本当は現地でライブを"体感"したいのです。
配信ライブはどうしても"視聴"になってしまいますからね・・・。
でも、東京は私にとっては遠いし、交通費や時間もかかる。ううう・・・。

なので、コロナが収束してもライブ配信はなくしてほしくないと思うのです。
まあ主催者側からみれば、余計な手間がかかるので、コロナが収束すれば従来通りに
配信はしない方向になってしまうかもしれません。
ただ、現地に足を運べない人からも得られる収益と、環境整備にかかる費用を天秤にかけて
前者に傾けば、これからも自宅で気軽にアーティストの歌や演奏を聴けるようになるかもしれませんね。

配信だとカメラに映らない箇所は見えないし、会場の空気(なんだそれ?)はつかめないし、
開演前や終演後の雰囲気(ワクワク、緊張感、余韻等)もわからないし、
物販でご本人とお話しすることもできない(そんなのあるのか?)し、
現地に足を運ぶに勝る方法はないんですが・・・。
(↑これらも全部想像で語ってます。)

そして配信ライブは「音ズレが訪れる」可能性があります。
配信ライブの最大の敵です。
TOMOOさんも昨年9月のワンマンでこれにやられてました。
やっぱり現地に足を運ぶに勝る方法はない(大事なことなので2回目)。


おっと、ライブと関係ないことを長々と書き連ねてしまいましたが、
ようやく本題のライブレポに移りたいと思います。
TOMOOさん中心に書きます。

セットリスト

前半

【TOMOO】
・雨粒をつけたまま
・らしくもなくたっていいでしょう
・風に立つ
・グッドラック


【水咲加奈】
・からだ
・水色になる
・今まで通りに
・君のいないライブハウス

~休憩~

後半

【TOMOO】
・Ginger
・ロマンスをこえよう
・いってらっしゃい

【水咲加奈】
・長電話
・yayuyo
・ある縁日の話

アンコール【TOMOO×水咲加奈】
・金色のかげ(TOMOO)



ライブの開幕はTOMOOさんの「雨粒をつけたまま」から。
最後の♬見えてるものが~ で歌詞が間に合わず、苦笑いするTOMOOさん('^_^;)。
短く挨拶を済ませ、ミニアルバム「Topaz」から「らしくもなくたっていいでしょう」と
「風に立つ」を弾き語りました。
最近SNSに動画上げたり、YouTube Liveでも歌っていた「グッドラック」も歌いました。
ちょうどこの季節の歌なので、近いうちに音源化されるのかな?


ここでTOMOOさんは一旦退出し、水咲加奈さんのステージへ移ります。
水咲さんが鍵盤を鳴らすと、なんか音が違うな?と思ったら、水咲さんはアコースティックピアノを弾いてました。
映像は暗くてわかりにくいのですが、おそらくアップライトピアノだと思います。
そういえば私はTOMOOさんがアコースティックピアノで弾き語りしているのをまだ見た/聴いたことがない。

「からだ」「水色になる」「今まで通りに」を連続で歌った後、MCに入ります。
MCでもピアノを弾いてます。
「一つ謝らないといけないことがあるのですが、私の東京のライブのときはいつも雨なんです。」
と雨女であることを話しました。
MCのあとは「君のいないライブハウス」を歌って前半終了。
歌の序盤で詰まってやり直してました('^_^;)。


休憩をはさみ、後半はTOMOOさんの「Ginger」から。イントロがいつもより長かったです。
配信シングルのお知らせを挟み「ロマンスをこえよう」を歌います。
MVは冬に公開されたのですが、曲のイメージは春の始め、ちょうど今の時期だということです。
MCでは「音楽は人間にとってどれくらい必要か」という問いかけに対する持論を語っていました。
「こんな問いかけをすること自体間違いだと思うんですけど」と言っていたのは、
コロナ禍でライブハウスが悪者扱いされてきたことに対して、TOMOOさんも何か思うことがあったのかもしれません。
確かに音楽でお腹は満たされないし、病は治せないし、電気代や水道代は払えないのは事実なのですが、
だからといって、人類がこれまで築き上げた音楽を遮断してはいけないと私も思います。

その後は「いってらっしゃい」を歌い、TOMOOさんのステージは終了。

水咲さんの後半ステージへ。
「yayuyo」は私の好みにあてはまるような曲でしたね。
MCではTOMOOさんとの出会いについて話していました。
とあるコンテストから話は始まります。
「私を落とすなんてなにもわかってない」とか、「コンテストで上に行った人たちを見下してやろう」とか、
当時はイキり少女だったのですが、それの最終戦で歌うTOMOOさんを見て
小さな女の子を見る母のような感情を抱き、以降彼女を追いかけるようになったとか。

MCで話題にした、とあるコンテストの映像はコチラ。

www.youtube.com

かれこれ8年も前の動画ですが、まだ残ってます。
水咲さんが「緊張しすぎて今にも死にそうな小鹿」と言っていましたが、まさにその通りです。
ガッチガチですね(笑)。緊張で声がところどころ震えています。
まあグランプリファイナルだし、人前で歌い始めて間もない頃でしょうから、
緊張しないほうがおかしいです。

ライブタイトル「僕らどこへでもゆける」の意味についても語っていました。
「後づけになってしまうのですが」と前置きして、
「このような状況(コロナ禍)で、身体の移動は制限されても、心は自由だ」という
意味を込めたと話しました。後づけだとしても、なかなかいい由来ですね。

MCの後は「ある縁日の話」をポップに歌い上げ終了。



手拍子が鳴り、アンコールへ。二人揃って再び登場。
二人の関係性について話しました。会ってもあまり喋らないとか。
先ほどのMCで水咲さんが話してた、TOMOOさんがガッチガチな状態で当時歌った
「金色のかげ」を二人で歌いました。
1番はTOMOOさんのピアノ伴奏で水咲さんが歌い、2番はTOMOOさんの弾き語りに
水咲さんのアコピとバックコーラスが加わる構成でした。

演奏が終わると、水咲さんは「最高」「期待を裏切らない」とか大喜びでした。
TOMOOさんが最後の1音間違えたらしいです(私にはわかりませんでした)。
彼女のミスが大好きな(笑)水咲さんは泣きそうだったのに一気に笑い状態に。
MCで水咲さんが張った伏線(?)を回収しにいくTOMOOさん、さすがです(笑)。

これにてライブは終了。

最後に

水咲さんは初めて聴いたのですが、ピアノと歌のみという少ない音数でも
しっかり独自の世界観を構築しているシンガーソングライターという印象でした。
語り多めでしたね。

TOMOOさんは安定のTOMOOさんでした(?)。
YouTube Liveのアーカイブが消えてフルで聴けなくなった「グッドラック」を再び聴けたのもよし。
欲を言えば、「サクラソング」を歌ってほしかったです。
少し前までは公式YouTubeチャンネルに動画があったのですが、あまり見ないうちに消えちゃいました・・・。
ツイキャスの過去動画でも聴けないので、この場で歌ってほしかったなあ。


長文駄文失礼! ぼんにゅい!

ファイル選択ダイアログボックスによる参照機能付きテキストボックス

中邑です。 

とりあえず始めたブログにとりあえず記事を書いてとりあえず継続します。


今回はC#のネタです。


ファイルやフォルダのパスを指定する場面でよく見かけるコイツ
f:id:Ponkotsu4989:20210221203339p:plain
ソースコードを書きたいと思います。

何て読んだらいいかわからないので、とりあえず(4回目)
「ファイル選択ダイアログボックスによる参照機能付きテキストボックス」と命名します。

これくらいのソースコードはネットに出回っていると思っていたのですが、
調べても出てこないので(私の調査不足かもしれません)、
この記事を書こうと思ったわけでございます。


クラス名はとりあえず(5回目)「CustomTextBox」とします。
なんか違うような気もするのですが、いい名前が思いつかないので、
とりあえず(6回目)これでいきましょう。

XAML

<UserControl
    x:Class="UserControls.CustomTextBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    d:DesignHeight="50"
    d:DesignWidth="500"
    mc:Ignorable="d">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="auto" />
        </Grid.ColumnDefinitions>
        <TextBlock Grid.ColumnSpan="2" Text="{Binding Explain}" />
        <TextBox
            Grid.Row="1"
            VerticalContentAlignment="Center"
            AllowDrop="True"
            Drop="TextBox_Drop"
            PreviewDragOver="TextBox_PreviewDragOver"
            Text="{Binding Text}" />
        <Button
            Grid.Row="1"
            Grid.Column="1"
            Click="OpenButton_Click">
            参照
        </Button>
    </Grid>
</UserControl>

C#

using Microsoft.Win32;
using Microsoft.WindowsAPICodePack.Dialogs;
using System;
using System.ComponentModel;
using System.IO;
using System.Windows;
using System.Windows.Controls;

namespace UserControls
{
    /// <summary>
    /// ダイアログボックスによる参照とドラッグアンドドロップによる入力が可能なテキストボックスを提供します。
    /// </summary>
    public partial class CustomTextBox : UserControl
    {
        private OpenFileDialog Dialog;
        private CommonOpenFileDialog FolderDialog;
        private CustomTextBoxViewModel ViewModel;
        private string ErrorMessage;

        /// <summary>
        /// 新しい<see cref="CustomTextBox"/>クラスのインスタンスを初期化します。
        /// </summary>
        public CustomTextBox()
        {
            InitializeComponent();

            Dialog = new OpenFileDialog
            {
                Filter = ""
            };

            FolderDialog = new CommonOpenFileDialog();

            ViewModel = new CustomTextBoxViewModel
            {
                Text = "",
                Explain = ""
            };

            DataContext = ViewModel;

            IsFolderDialog = false;
        }

        /// <summary>
        /// ファイル選択ダイアログのフィルタを取得または設定します。
        /// 既定値は<see cref="string.Empty"/>です。
        /// </summary>
        public string Filter
        {
            get
            {
                return Dialog.Filter;
            }
            set
            {
                Dialog.Filter = value;
            }
        }

        /// <summary>
        /// テキストボックス内の文字列を取得または設定します。
        /// </summary>
        public string Text
        {
            get
            {
                return ViewModel.Text;
            }
            set
            {
                ViewModel.Text = value;
            }
        }

        /// <summary>
        /// テキストボックスに入力する値の説明を取得または設定します。
        /// 既定値は<see cref="string.Empty"/>です。
        /// </summary>
        public string Explain
        {
            get
            {
                return ViewModel.Explain;
            }
            set
            {
                ViewModel.Explain = value;
            }
        }

        /// <summary>
        /// フォルダ選択ダイアログとして使用するかどうかを取得または設定します。
        /// 既定値は<see langword="false"/>です。
        /// </summary>
        public bool IsFolderDialog
        {
            get
            {
                return FolderDialog.IsFolderPicker;
            }
            set
            {
                FolderDialog.IsFolderPicker = value;
            }
        }

        /// <summary>
        /// テキストボックスに入力した値に不正があった場合、メッセージボックスを開きエラーメッセージを表示するかどうかを取得または設定します。
        /// 既定値は<see langword="true"/>です。
        /// </summary>
        public bool IsShowingError { get; set; } = true;

        /// <summary>
        /// ファイル選択ダイアログボックスを開き、選択したファイルのパスをテキストボックスへ代入する
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="routed"></param>
        private void OpenButton_Click(object sender, RoutedEventArgs routed)
        {
            if (IsFolderDialog)
            {

                if (FolderDialog.ShowDialog() == CommonFileDialogResult.Ok)
                {
                    SetPathToTextBox(FolderDialog.FileName);
                }
                return;
            }
            if (Dialog.ShowDialog() == true)
            {
                Dialog.Filter = Filter;
                SetPathToTextBox(Dialog.FileName);
            }
        }

        private void TextBox_PreviewDragOver(object sender, DragEventArgs drag)
        {
            if (drag.Data.GetDataPresent(DataFormats.FileDrop, true))
            {
                drag.Effects = DragDropEffects.Copy;
            }
            else
            {
                drag.Effects = DragDropEffects.None;
            }
            drag.Handled = true;
        }

        private void TextBox_Drop(object sender, DragEventArgs drag)
        {
            var dropFiles = drag.Data.GetData(DataFormats.FileDrop, true) as string[];

            if (dropFiles != null)
            {
                SetPathToTextBox(dropFiles[0]);
            }
        }

        /// <summary>
        /// テキストボックスにパスを代入します。
        /// </summary>
        /// <param name="path"></param>
        private void SetPathToTextBox(string path)
        {
            Text = path;
            ViewModel.Text = path;
        }

        /// <summary>
        /// メッセージボックスを開き、エラーメッセージを表示します。
        /// </summary>
        private void ShowError()
        {
            MessageBox.Show(ErrorMessage, "エラー", MessageBoxButton.OK, MessageBoxImage.Error);
            ErrorMessage = "";
        }

        /// <summary>
        /// テキストボックスに入力されたパスまたはディレクトリの存在するか調べます。
        /// </summary>
        /// <param name="createNewDirectory">
        /// <see langword="true"/>の場合、入力したディレクトリが存在しない場合に新しいディレクトリを作成します。
        /// </param>
        /// <returns>
        /// テキストボックスに入力されたパスまたはディレクトリが存在する場合は<see langword="true"/>を返します。
        /// 存在しない場合や、長さが0の文字列の場合は<see langword="false"/>を返します。
        /// </returns>
        public bool CheckPathOrDirectory(bool createNewDirectory)
        {
            bool result = true;

            if (IsFolderDialog)
            {
                result = CheckDirectory(createNewDirectory);
            }
            else
            {
                result = CheckPath();
            }

            if (!result && IsShowingError)
            {
                ShowError();
            }

            return result;
        }

        /// <summary>
        /// テキストボックスに入力されたパスの存在の有無を調べます。
        /// </summary>
        /// <returns>
        /// テキストボックスに入力されたパスが存在する場合は<see langword="true"/>を返します。
        /// 存在しない場合や、長さが0の文字列の場合は<see langword="false"/>を返します。
        /// </returns>
        private bool CheckPath()
        {
            bool result = true;

            if (string.IsNullOrEmpty(Text))
            {
                ErrorMessage = "パスを入力してください";
                result = false;
            }
            else if (!File.Exists(Text))
            {
                ErrorMessage = $"{Text}が見つかりませんでした。";
                result = false;
            }

            return result;
        }

        private bool CheckDirectory(bool createNewDirectory = true)
        {
            if (!Directory.Exists(Text))
            {
                if (createNewDirectory)
                {
                    try
                    {
                        Directory.CreateDirectory(Text);
                        return CheckDirectory();
                    }
                    catch (Exception ex)
                    {
                        ErrorMessage = ex.Message;
                        return false;
                    }

                }
                else
                {
                    ErrorMessage = $"{Text}が見つかりませんでした。";
                    return false;
                }
            }

            return true;
        }

        /// <summary>
        /// データバインディング用の内部クラスです。
        /// </summary>
        class CustomTextBoxViewModel : INotifyPropertyChanged
        {
            private string text;
            private string explain;
            public event PropertyChangedEventHandler PropertyChanged;

            public string Text
            {
                get
                {
                    return text;
                }
                set
                {
                    text = value;
                    NotifyPropertyChanged("Text");
                }
            }

            public string Explain
            {
                get
                {
                    return explain;
                }
                set
                {
                    explain = value;
                    NotifyPropertyChanged("Explain");
                }
            }

            /// <summary>
            /// プロパティの値が変更されたことを通知します。
            /// </summary>
            /// <param name="propertyName">プロパティ名</param>
            private void NotifyPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }

    }

}

ちなみに、このクラスを利用するにはMicrosoft.WindowsAPICodePack-Shellをインストールする必要があります。
インストール方法はこれでも読め

最後に

フォントファミリーやフォントサイズが変更できなかったり、
パスの入力を禁止にできないなど、まだ発展途上ではありますが
これからも随時修正する予定です。

【過去記事】ライブレポ 「TOPAZ」発売記念配信LIVE 〜それもまた宝石〜

この記事は以前のブログで2020年9月13日に書いたものです。

 この駄文だけはなんだかんだで残しておきたかったので引越ししました。

 

 

 

アーティスト:TOMOO

出演者:TOMOO(Vo & Key)

    北原裕司(Ba)

    関口孝夫(Dr)

開催日:2020年9月5日(土)

場所 :ツイキャス

 

曲目

====================

恋する10秒

らしくもなくたっていいでしょう

レモン

Pop'n Roll Music(途中で音が消える)

Lullaby to My Summer

高台

雨でも花火に行こうよ

風に立つ

ロマンスをこえよう

いってらっしゃい

Pop'n Roll Music(トラブルのため再演)

====================

 

初めてのライブレポを書きます。

レポを書くのがライブから1週間も経ってしまいました。

当日は1時間遅れで参加しましたので、そこから書きます。

 

ライブ始まってるのに「オフラインです」って表示されて、???ってなってたのですが

コメント欄には「音がずれてます」と書いてあったので、

配信トラブルに見舞われていると理解できました。

音ズレが訪れていると・・・おっと。

 

しばらくするとTOMOOさんの姿が映りました。

音ズレが直らないのか、質問コーナーが始まりました。

「詩先か曲先か」とか、アルバム制作の話などいろんな質問がありました(省略)。

きーさん(北原裕司さん)は「最後の瞳」を聴くと泣いてしまうとか。

でもTOMOOさんは「今日はやらない」とバッサリ。

 

どうやら音ズレを完璧に直すのは難しく、そのまま続行する羽目に。

再開後は、「Lullaby to My Summer」と「高台」を弾き語りしました。

この2曲を通しで聴けたのが私にとっての大きな収穫です。

私が彼女を知ったのは「恋する10秒」以後なので、それ以前の曲を知れたのは嬉しかったです。

 

 

弾き語りが終わると、「TOMOOマスクプレゼント企画」なるものが始まりました(笑)。

TOMOOさんはミシンを扱うのが10年ぶりということで、

事前に講師の方から講義を受けたとか。

チャコペン」なんて言葉久しぶりに聞きましたねぇ。

てか、チャコペンって何する道具でしたっけ?

 

 

途中からダイジェスト映像になって、ようやく完成!!

製作時間、1枚3時間半(笑)!

「らしくもなくたっていいでしょう」のMVのような、青中心の鮮やかなマスクになりました。

プレゼント受け取れるのは1名様という高い競争率になってしまいましたが、

きっと「心の広い人に届く」でしょう。

 

 

ここで企画は終わり、「雨でも花火に行こうよ」を歌います。

左上にはなぜか「いってらっしゃい」と表示されていて、

少し暗転したあと「雨でも花火に行こうよ」に修正されました。

ここからは「風に立つ」「ロマンスをこえよう」「いってらっしゃい」と

アルバム収録曲が並びました。

 

そして最後、途中で音声が止まってしまった「Pop'n Roll Music」を再び。

きーさんのベースソロがめっちゃ歪んでる。

「Pop'n Roll Music」の再演でライブは終了しました。

 

 

その後はアーカイブで見逃した部分を見ました。

「恋する10秒」

「らしくもなくたっていいでしょう」

「レモン」

「Pop'n Roll Music」

を歌ってました。

「Pop'n Roll Music」の途中で音が消えてしまいました。

 

 

彼女は配信とは相性があまり良くないそうです。

(YouTubeの誕生日ライブではなぜか規約違反として消されてましたね)

そのおかけで補填企画でまた彼女の歌を聴けるのですが(喜んでいいことですか?)。

 

こんな事態なのでいつその日か来るかわからないのですが、

生で彼女の歌や演奏を聴ける日を待っています。

彼女に限らず私はミュージシャンのライブに参加したことが1回もないのです。

コロナで死んでたまるかと自分に言い聞かせながら毎日を生きたいと思います。

 

 

長文駄文失礼しました。ボンニュイ

ブログはじめました。

中邑です。

 

ブログはじめました。

 

正確には、はじめましたではなく、再始動しましたです。

 

以前別の名義でブログ書いていたのですが、

・しばらくほったらかしてたこと

・名義を変えたこと

Twitterと連携させたこと

等を理由に新たに作り直しました。

 

毎日が退屈だったこともあり、とりあえずブログでも始めようと思い立ったのですが、

動機が「とりあえず」だったので、結局三日坊主になってしまいました。

 

今度こそは三日坊主にならないように最低週一で記事書くぞ・・・

↑さて、いつまで続くでしょうか。

 

ま、というわけで、よろしくお願いします。