做了一个梦《自我交换》

第一幕 初见交换

我是一个富二代,想要去澡堂子洗澡,这个澡堂子是个高级澡堂子,开在一个大娱乐城里面,票卖光了想进去,通过“自我交换”,成功混了进去。大致过程是,我转换成了别人,论证了我可以进去的必要性。太具体的记不得了。

第二幕 如梦初醒

我是一个宅男,天天宅在家里,我女朋友来找我玩。我妈在厕所洗澡,我女朋友催我洗澡,我墨墨迹迹地打开门,发现我爸从里面出来,原来我爸使用了“自我交换”,如梦初醒,还能这么玩?

第三幕 我是上帝

连续几天,带着女朋友又去澡堂。每天通过不同的自我交换的方法混进澡堂。最简单的交换成其他宾客进去。还有和现场宾客决斗,发现手枪里没有子弹,交换人格后交换手枪。还有通过交换顺到票。在娱乐城里还遇见了我妈,我女朋友和我妈说话拼命得罪我妈,我交换成我女朋友,安抚了我妈。(这一段是梦里最清晰的,交换的过程,我们两个人仿佛先是融化在了一起,接下来就是以我女朋友的视角对着我妈,整个交换结束后,我和我女朋友的位置也交换了。)

总结一下机制

梦里面,其实融合了人的身份交换,穿越过去等多种机制,这里有逻辑矛盾。我不能又交换,又预测未来,所以这个机制可以是只能在向正常时间流向的发展中,随机应变。

转换的过程,先是两个人仿佛先是融化在了一起,然后以对方的视角做一些事情,时间一到,或者自我解除后会转换回来,转换后二人位置不能颠倒。这样的话,第二幕是不符合设定的,第三幕部分不符合设定。

Ubuntu 命令行管理 IOS 设备,传输文件或者照片

今天一个朋友问到我,他电脑装不上 iTunes,还希望传输他的容量高达 1TB 的照片数据到电脑上。

想了一些现成方案以后发现都不合适。于是勾起了我的兴趣,中间走了一些弯路,比如绕道 PTP 协议连接相机,读取文件,但是会遇到 ios版本以及兼容性问题,折腾了一圈没想到还真找到了好用的工具 ifuse,总结分享一下

安装必要工具

sudo apt install ifuse libimobiledevice-utils

ifuse 是专门用于挂载 ios 设备的工具

读取设备 UDID

idevice_id -l

OUTPUT

XXXX-XXXXXX

新建挂载文件夹并挂载 IOS 设备

mkdir ~/ios
ifuse -u XXXX-XXXXXX ~/ios

访问并打印文件列表

cd ~/ios
ls -lah

OUTPUT

total 0
drwxr-xr-x 19 bh bh  608  6月  9 22:26 .
drwxr-xr-x  1 bh bh 5.6K  7月 24 01:56 ..
drwxr-xr-x 11 bh bh  352  7月 23 05:47 Books
drwxr-xr-x  3 bh bh   96  4月 26 02:20 CloudAssets
drwxr-xr-x 21 bh bh  672  6月  6 16:09 DCIM
drwxr-xr-x  3 bh bh   96 11月  2  2020 Deferred
drwxr-xr-x  6 bh bh  192 11月 20  2022 Downloads
drwxr-xr-x  2 bh bh   64  6月  9 22:26 EnhancedAudioSharedKeys
drwxr-xr-x  3 bh bh   96  5月 16 18:53 Espresso
drwxr-xr-x  2 bh bh   64  6月  6  2021 general_storage
drwxr-xr-x  6 bh bh  192  3月 29  2021 iTunes_Control
drwxr-xr-x  6 bh bh  192  4月 27 15:40 MediaAnalysis
drwxr-xr-x 30 bh bh  960  7月 15 21:29 PhotoData
drwxr-xr-x  2 bh bh   64 11月 25  2020 Photos
drwxr-xr-x  3 bh bh   96 11月 22  2020 PhotoStreamsData
drwxr-xr-x  2 bh bh   64  6月  6  2021 PublicStaging
drwxr-xr-x  2 bh bh   64  9月 26  2018 Purchases
drwxr-xr-x  5 bh bh  160 12月  9  2020 Radio
drwxr-xr-x  2 bh bh   64 12月 15  2021 Recordings

可以看到,iOS 设备已经被挂载到本地目录了,照片数据均在 DCIM 目录下,可以直接一个 rsync 平拷出来

rsync 同步文件

rsync -av ./DCIM ~/

经过漫长的等待,照片全部同步完毕

性能

我通过 USB-C lightning 连接线,直插电脑与 iPhone12
全程通过 iotop 监控磁盘读写情况

平均传输速度大概在 20MB/s

那么传输 1GB 的数据大概需要 50s
那么传输 1TB 的数据大概需要 13h 50m

Docker 构建 stable diffusion 1.5 webui 搭建流程记录

Docker 构建 SD 1.5 webui

Blind Holmes
v0.0.1

Written with StackEdit.

搭建流程记录

下载 nvidia 官方 cuda 镜像

https://hub.docker.com/r/nvidia/cuda/tags

docker pull nvidia/cuda:12.2.0-devel-ubuntu20.04

运行并创建容器

docker run -id --name sd nvidia/cuda:12.2.0-devel-ubuntu20.04 /bin/bash

连接容器

docker exec -it sd /bin/bash

安装必要环境

apt update; apt install wget git python3 python3-venv python3-pip sudo libgoogle-perftools4 libtcmalloc-minimal4 vim net-tools

创建用户

adduser user
adduser user sudo

以新用户连接容器

docker exec -it --user 1000 sd /bin/bash

创建 SD 目录

sudo mkdir /opt/stable_diffusion_webui;
sudo chown user:user /opt/stable_diffusion_webui;

安装 SD_WEB_UI

遵循:https://github.com/AUTOMATIC1111/stable-diffusion-webui

cd /opt/stable_diffusion_webui;
bash <(wget -qO- https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh);

执行后遇到错误

RuntimeError: Torch is not able to use GPU; add --skip-torch-cuda-test to COMMANDLINE_ARGS variable to disable this check

于是直接执行 py 脚本

python3 launch.py

安装了一些依赖以后还是遇到错误

RuntimeError: Torch is not able to use GPU; add --skip-torch-cuda-test to COMMANDLINE_ARGS variable to disable this check

根据提示,增加参数执行

python3 launch.py --skip-torch-cuda-test

之后继续下载并安装必要依赖

猜测错误来源:我是使用的 AMD R9 7945HX + RTX 4070 的笔记本,核显 + 独显的组合,虽然开了独显直连模式,但是在显卡识别上面可能还是有问题,比如识别到了 AMD 集显所以在 cuda 测试中出错。暂时不确定是否是 Torch 的问题。

运行一段时间之后又有报错

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

尝试安装系统依赖:

sudo apt install ffmpeg libsm6 libxext6

安装过程中涉及到 tzdata 的时区设定……需要手动设定,这里是个问题!
设置为非交互式安装可以搞定

DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata

之后继续执行 launch.py,继续正常下载安装……
之后再度遭遇报错

RuntimeError: "addmm_impl_cpu_" not implemented for 'Half'
RuntimeError: "LayerNormKernelImpl" not implemented for 'Half'

貌似还是显卡识别的问题,先尝试增加执行参数,另外再增加本地端口监听等,方便外部访问

python3 launch.py --skip-torch-cuda-test --precision full --no-half --listen --enable-insecure-extension-access --theme dark --gradio-queue

终于运行起来了,并且能够从外部访问并安装扩展。出图会调用 CPU,速度奇慢无比。接下来要解决一下 CUDA 调用问题……
试试添加参数 --xformers 运行

python3 launch.py --skip-torch-cuda-test --precision full --no-half --listen --enable-insecure-extension-access --theme dark --gradio-queue --xformers

失败,还是 CPU 在执行,并且出图报错:

NotImplementedError: No operator found for `memory_efficient_attention_forward` with inputs: query : shape=(1, 4096, 1, 512) (torch.float32) key : shape=(1, 4096, 1, 512) (torch.float32) value : shape=(1, 4096, 1, 512) (torch.float32) attn_bias : <class 'NoneType'> p : 0.0 `cutlassF` is not supported because: device=cpu (supported: {'cuda'}) `flshattF` is not supported because: device=cpu (supported: {'cuda'}) dtype=torch.float32 (supported: {torch.float16, torch.bfloat16}) max(query.shape[-1] != value.shape[-1]) > 128 `tritonflashattF` is not supported because: device=cpu (supported: {'cuda'}) dtype=torch.float32 (supported: {torch.float16, torch.bfloat16}) max(query.shape[-1] != value.shape[-1]) > 128 Operator wasn't built - see `python -m xformers.info` for more info triton is not available `smallkF` is not supported because: max(query.shape[-1] != value.shape[-1]) > 32 unsupported embed per head: 512
Time taken: 1m 1.21s

估计还是 cuda 调用方面各种问题,看来需要解决一下看看能不能把 --skip-torch-cuda-test --precision full --no-half 这种参数去掉

我在容器内创建一个脚本 test.py

#!/usr/bin/env python3
# coding=utf-8

import torch
print(torch.cuda.device_count())   # --> 0
print(torch.cuda.is_available())   # --> False
print(torch.version.cuda)          # --> 9.0.176
print(torch.cuda.current_device())
print(torch.cuda.is_available())

执行后,打印

/home/user/.local/lib/python3.8/site-packages/torch/cuda/__init__.py:546: UserWarning: Can't initialize NVML
  warnings.warn("Can't initialize NVML")
0
False
11.8
Traceback (most recent call last):
  File "./test.py", line 10, in <module>
    print(torch.cuda.current_device())
  File "/home/user/.local/lib/python3.8/site-packages/torch/cuda/__init__.py", line 674, in current_device
    _lazy_init()
  File "/home/user/.local/lib/python3.8/site-packages/torch/cuda/__init__.py", line 247, in _lazy_init
    torch._C._cuda_init()
RuntimeError: No CUDA GPUs are available

可以看出来,完全无法调用 cuda 啊啊。
于是退出 docker,在本机环境安装 torch 后创建并执行同一脚本,打印:

1
True
11.7
0
True

看来,我本机 cuda 驱动和依赖应该没这个问题,那么就还是 docker image 的原生环境问题。
思考一下,找找其他解决方案。

找到了这个:
https://stackoverflow.com/questions/54264338/why-does-pytorch-not-find-my-nvdia-drivers-for-cuda-support


https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch/tags
中拉取现成的 nv pytorch 镜像,编写一个简单的 docker compose 脚本就可以了

看来 nv 专门针对这种场景搞了 docker 镜像,前面是走了弯路了……
使用说明:
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch

唉……,要从头开始了……

docker pull nvcr.io/nvidia/pytorch:23.06-py3

镜像有 8.58 GB,下载过程中正好来整理一下前面的安装命令

安装系统环境

apt update && \
apt upgrade -y && \
DEBIAN_FRONTEND=noninteractive \
apt install -y --no-install-recommends \
wget git python3 python3-venv python3-pip sudo libgoogle-perftools4 libtcmalloc-minimal4 ffmpeg libsm6 libxext6 libpng-dev libjpeg-dev vim net-tools && \
adduser --disabled-password --gecos '' user && \
echo -e "000000\n000000" | passwd user && \
adduser user sudo && \
mkdir /opt/sd && \
chown user:user /opt/sd && \
runuser -l user -c 'cd /opt/sd && bash <(wget -qO- https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh)'

梳理差不多了,镜像也下载完
先把之前的容器改个名字

docker rename sd sd_bak

然后生成新的容器

docker run --gpus all -id --name sd nvcr.io/nvidia/pytorch:23.06-py3

结果上来就报错哈哈

docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].

查了一下本机要先安装 nvidia-container-toolkit
https://github.com/NVIDIA/nvidia-container-toolkit
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
https://www.server-world.info/en/note?os=Ubuntu_22.04&p=nvidia&f=2
注意系统版本,使用本机 root 用户执行命令:

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add -;
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu22.04/nvidia-docker.list > /etc/apt/sources.list.d/nvidia-docker.list;
apt install -y nvidia-container-toolkit;
service docker restart;

接下来执行容器化

docker run --gpus all -id --name sd nvcr.io/nvidia/pytorch:23.06-py3

成功!啥也不说,先确认一下 torch 的情况,登入容器

docker exec -it sd /bin/bash

直接命令行检查

root@a26289624dd6:/workspace# python
Python 3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.cuda.device_count())
1
>>> print(torch.cuda.is_available())
True
>>> print(torch.version.cuda)
12.1
>>> print(torch.cuda.current_device())
0
>>> print(torch.cuda.is_available())
True
>>>

赞!有了!直接执行整理好的命令集,直接成了
执行命令运行环境

python3 launch.py --listen --enable-insecure-extension-access --theme dark --gradio-queue --xformers

倒是可以运行起来了,但是这里出了一个插曲,xformers 报错:

Launching Web UI with arguments: --listen --enable-insecure-extension-access --theme dark --gradio-queue --xformers
NOTE! Installing ujson may make loading annotations faster.
WARNING[XFORMERS]: xFormers can't load C++/CUDA extensions. xFormers was built for:
    PyTorch 2.0.1+cu118 with CUDA 1108 (you have 2.1.0a0+4136153)
    Python  3.10.11 (you have 3.10.6)
  Please reinstall xformers (see https://github.com/facebookresearch/xformers#installing-xformers)
  Memory-efficient attention, SwiGLU, sparse and more won't be available.
  Set XFORMERS_MORE_DETAILS=1 for more details
*** Error setting up CodeFormer
    Traceback (most recent call last):
      File "/opt/sd/stable-diffusion-webui/modules/codeformer_model.py", line 33, in setup_model
        from facelib.utils.face_restoration_helper import FaceRestoreHelper
      File "/opt/sd/stable-diffusion-webui/repositories/CodeFormer/facelib/utils/face_restoration_helper.py", line 7, in <module>
        from facelib.detection import init_detection_model
      File "/opt/sd/stable-diffusion-webui/repositories/CodeFormer/facelib/detection/__init__.py", line 11, in <module>
        from .yolov5face.face_detector import YoloDetector
      File "/opt/sd/stable-diffusion-webui/repositories/CodeFormer/facelib/detection/yolov5face/face_detector.py", line 20, in <module>
        IS_HIGH_VERSION = tuple(map(int, torch.__version__.split('+')[0].split('.'))) >= (1, 9, 0)
    ValueError: invalid literal for int() with base 10: '0a0'

---

可能在依赖安装顺序上存在问题,于是重新安装 pip 依赖试试看

/usr/bin/python3 -m pip install --upgrade pip;
pip install torch==2.0.0+cu118 torchvision==0.15.1+cu118 torchaudio==2.0.1+cu118 torchtext==0.15.1 torchdata==0.6.0 --extra-index-url https://download.pytorch.org/whl/cu118 -U;
pip install xformers==0.0.19 triton==2.0.0 -U

呃,装完依赖以后项目直接跑不起来了

Launching Web UI with arguments: --listen --enable-insecure-extension-access --theme dark --gradio-queue --xformers
/home/user/.local/lib/python3.10/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: '/home/user/.local/lib/python3.10/site-packages/torchvision/image.so: undefined symbol: _ZN3c106detail23torchInternalAssertFailEPKcS2_jS2_RKSs'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?
  warn(
Traceback (most recent call last):
  File "/opt/sd/stable-diffusion-webui/launch.py", line 38, in <module>
    main()
  File "/opt/sd/stable-diffusion-webui/launch.py", line 34, in main
    start()
  File "/opt/sd/stable-diffusion-webui/modules/launch_utils.py", line 340, in start
    import webui
  File "/opt/sd/stable-diffusion-webui/webui.py", line 28, in <module>
    import pytorch_lightning   # noqa: F401 # pytorch_lightning should be imported after torch, but it re-enables warnings on import so import once to disable them
  File "/home/user/.local/lib/python3.10/site-packages/pytorch_lightning/__init__.py", line 35, in <module>
    from pytorch_lightning.callbacks import Callback  # noqa: E402
  File "/home/user/.local/lib/python3.10/site-packages/pytorch_lightning/callbacks/__init__.py", line 14, in <module>
    from pytorch_lightning.callbacks.batch_size_finder import BatchSizeFinder
  File "/home/user/.local/lib/python3.10/site-packages/pytorch_lightning/callbacks/batch_size_finder.py", line 24, in <module>
    from pytorch_lightning.callbacks.callback import Callback
  File "/home/user/.local/lib/python3.10/site-packages/pytorch_lightning/callbacks/callback.py", line 25, in <module>
    from pytorch_lightning.utilities.types import STEP_OUTPUT
  File "/home/user/.local/lib/python3.10/site-packages/pytorch_lightning/utilities/types.py", line 27, in <module>
    from torchmetrics import Metric
  File "/home/user/.local/lib/python3.10/site-packages/torchmetrics/__init__.py", line 14, in <module>
    from torchmetrics import functional  # noqa: E402
  File "/home/user/.local/lib/python3.10/site-packages/torchmetrics/functional/__init__.py", line 14, in <module>
    from torchmetrics.functional.audio._deprecated import _permutation_invariant_training as permutation_invariant_training
  File "/home/user/.local/lib/python3.10/site-packages/torchmetrics/functional/audio/__init__.py", line 14, in <module>
    from torchmetrics.functional.audio.pit import permutation_invariant_training, pit_permutate
  File "/home/user/.local/lib/python3.10/site-packages/torchmetrics/functional/audio/pit.py", line 23, in <module>
    from torchmetrics.utilities import rank_zero_warn
  File "/home/user/.local/lib/python3.10/site-packages/torchmetrics/utilities/__init__.py", line 14, in <module>
    from torchmetrics.utilities.checks import check_forward_full_state_property
  File "/home/user/.local/lib/python3.10/site-packages/torchmetrics/utilities/checks.py", line 25, in <module>
    from torchmetrics.metric import Metric
  File "/home/user/.local/lib/python3.10/site-packages/torchmetrics/metric.py", line 30, in <module>
    from torchmetrics.utilities.data import (
  File "/home/user/.local/lib/python3.10/site-packages/torchmetrics/utilities/data.py", line 22, in <module>
    from torchmetrics.utilities.imports import _TORCH_GREATER_EQUAL_1_12, _XLA_AVAILABLE
  File "/home/user/.local/lib/python3.10/site-packages/torchmetrics/utilities/imports.py", line 48, in <module>
    _TORCHAUDIO_GREATER_EQUAL_0_10: Optional[bool] = compare_version("torchaudio", operator.ge, "0.10.0")
  File "/home/user/.local/lib/python3.10/site-packages/lightning_utilities/core/imports.py", line 73, in compare_version
    pkg = importlib.import_module(package)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/home/user/.local/lib/python3.10/site-packages/torchaudio/__init__.py", line 1, in <module>
    from torchaudio import (  # noqa: F401
  File "/home/user/.local/lib/python3.10/site-packages/torchaudio/_extension/__init__.py", line 43, in <module>
    _load_lib("libtorchaudio")
  File "/home/user/.local/lib/python3.10/site-packages/torchaudio/_extension/utils.py", line 61, in _load_lib
    torch.ops.load_library(path)
  File "/home/user/.local/lib/python3.10/site-packages/torch/_ops.py", line 643, in load_library
    ctypes.CDLL(path)
  File "/usr/lib/python3.10/ctypes/__init__.py", line 374, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: libcudart.so.11.0: cannot open shared object file: No such file or directory

删掉项目目录中的 venv 目录,重新执行 webui.sh
经过一轮安装后问题照旧,经过调试,发现其实是 torchvision 无法被引入导致,那么激活 venv 重装 torchvision 试试,重装还报错了

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
xformers 0.0.20 requires pyre-extensions==0.0.29, which is not installed.
numba 0.57.1 requires numpy<1.25,>=1.21, but you have numpy 1.25.1 which is incompatible.
google-auth 2.22.0 requires urllib3<2.0, but you have urllib3 2.0.3 which is incompatible.
blendmodes 2022 requires Pillow<10,>=9.0.0, but you have pillow 10.0.0 which is incompatible.

不过项目倒是 run 起来了,现在遇到了显存分配问题

torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 20.00 MiB (GPU 0; 7.73 GiB total capacity; 3.42 GiB already allocated; 42.25 MiB free; 3.47 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

查了一些资料,怀疑是进程通讯限制导致的,增加 --ipc host 参数,再重来了

docker run --gpus all --ipc host -id --name sd nvcr.io/nvidia/pytorch:23.06-py3

还是不行,经历了若干轮重装后,各种报错,总之,最后要重装 xformers

pip3 install -U xformers

奇怪,装完了以后 venv 消失了……
又经过重装,回到原点,重装 torchvision 试试

pip install --force-reinstall torchvision

成了!终于正常 run 起来!测试了一下出图,查看运行效率和 cpu 占用,都正常。终于搞定了。
整个安装流程需要好好梳理一下!

一段关于审美的思考与反思

审美是个习惯养成

审美是简单至复杂

在一个审美语言系统下,从简单到复杂分高低

不在一个审美语言系统下,无法分高低

如果未养成习惯,则未建立审美语言系统,也无法分高低

乐评人如果评价音乐,是要建立在审美语言系统上的,那么就有高低之分。但是如果乐评人不建立审美语言系统,那么他的评价就是无意义的,因为他的评价不是建立在一个审美语言系统上的。

比如丁太升说 vava 的说唱 flow 简单,而他自己又不知道什么是复杂的 flow。那么这个就是一个低水准乐评。

乐评人批评一个音乐,这个音乐有广泛受众的情况下,好的乐评人应该兼顾这些受众,发表尽可能多的人可以接受的批评,那么这个乐评人就是高水准的乐评人。反之,如果他的批评,只有少数人可以接受,那么这个乐评人就是低水准的乐评人。

批评的价值在于让人们反思,接受,改进。如果批评的内容,只有少数人可以接受,那么这个批评的意义就接近于自我泻愤的情绪宣泄,而不能让人们进步,且这种嫌恶感本质是一种排外反应,不符合爱与包容的普适价值。

比如,梁源说,我听过两万张唱片,所以我的品味比你高,我的乐评就比你高贵,这个理由实际是站不住脚的。因为他的评价建立在了一个不确定的审美语言系统上。

作为一个优秀评论家或者批评家,当听到有人在听一个低水准的音乐,可以通过推荐在同一审美语言系统下的相对高水准的音乐来让人们用脚投票,认识到其听的音乐的低水准,从而提高自己的审美水准。之后再可以分析这个低水准音乐的原因,即,人们接受了高级的音乐,形成了对比,才有可能认识到低级音乐的低级之处,这是一个循序渐进的过程。

如果,批评家的批评,只是单纯的批评,而没有提供更好的选择,那么这个批评就是没有意义的,因为人们不知道怎么去改进,而只是单纯的批评,这个批评就是没有意义的,或者说是低水准的。

一个容易让人接受的批评是优秀的批评,优秀的批评的特征:

1. 建立在一个确定的审美语言系统上

2. 提供了更好的选择

这种审美的传播,才是审美推广或者推荐的正确方式。符合爱与包容的价值观。

举一个实践的例子,一个人在听垃圾说唱,比如《大碗宽面》,那么我可以推荐他听……,嗯,说到这我其实又去仔细听了《大碗宽面》,企图去找明显比这首优秀的 Trap 说唱。但我发现并没有找到。说明我认为《大碗宽面》是垃圾说唱源自于我自己的偏见,我并没有资格批评《大碗宽面》,同时我对 Trap 类型说唱也同样缺乏了解。

这也是一个依据理论反思自己,认识到自己不足的过程。

如果有人在听小星星的儿歌,我就会推荐他去听莫札特的《小星星變奏曲》完整版。这个过程他就会进一步了解这个音乐复杂性,提高对复杂审美的认知。同时亦可以引入关于音乐的故事:很久以前,这首曲子原来是流传于法国地区的名谣,《妈妈,请听我说》。第一次去到法国巡演的音乐神童─小莫札特,在八岁时第一次听见这首歌曲。当二十二岁的莫札特再次与母亲二人去到法国、寻求机会时,母亲生病了,越来越虚弱,在弥留之际已经听不见语言、看不见画面。莫札特于是在钢琴前坐下来,将这首《妈妈,我要跟你说》创作改编成一首变奏曲,将无法传达给母亲的语言化为音乐,如教堂的钟声一般,送母亲走完最后一程。而这首变奏曲,便是广为流传的、你我都听过的《小星星变奏曲》。批评了儿歌的简单,不否定简单儿歌的价值,并且提供了更好的选择,帮助人提高审美水准。

经过这两段实际的推演,我发现我本来以为的绝大多数的所谓低水准的音乐,要不然就是我的偏见,要不然都是有其特定价值存在。我无法一概而论什么音乐是低价值的。